gpt4 book ai didi

R 有条件地通过查找替换更多列

转载 作者:行者123 更新时间:2023-12-04 12:07:44 25 4
gpt4 key购买 nike

假设我们在数据框 df1 和一列中确实有很多数据列(名称为 mycols 以及一些在本例中不应处理的未命名列) subj 也是另一个数据框 df2 的索引,其中包含 replsubj 列(在第二个数据框中是 < strong>subj unique)和许多其他不重要的列(它们在此的唯一作用是,我们不能假设只有 2 列)。

我想以这样的方式替换列的子集( df1[,mycols] ),即如果存在 NA ( df1[ ,mycols][is.na(df1[,mycols])] ) <- 替换为 df2$repl 列的值,其中 df2 中的行有df2$subj = df1$subj

编辑:示例数据(我不知道将其写入数据帧分配的命令):

mycols = c("a","b")
df1:
subj a b c
1 NA NA 1
1 2 3 5
2 0 NA 2
3 8 8 8
df2:
subj repl notinterested
1 5 1000
2 6 0
3 40 10
result:
df1-transformed-to:
subj a b c
1 5 5 1 #the 2 fives appeared by lookup
1 2 3 5
2 0 6 2 #the 6 appeared
3 8 8 8

我想出了以下代码:

df1[,mycols][is.na(df1[,mycols])] <- df2[match( df1$subj, df2$subj),"repl"] 

但问题是(我认为),右侧的大小与左侧的大小不同 - 我认为它可能适用于“mycols”中的一列,但我想对所有mycols执行相同的操作(如果NA,则查找表df2并替换 - 替换值在范围内相同行)。

(此外,我需要每次都按名称 mycols 明确枚举列,因为可能还有其他列)

作为关于编程风格的小问题 - 在 R 中,编写此操作的良好且快速的方法是什么?如果它是一种过程语言,我们可以进行改造

df1[,mycols][is.na(df1[,mycols])]

采用一种我认为更好、更具可读性的方法:

function(x){ *x[is.na(*x)] }
function(& df1[,mycols])

并确保没有任何内容被不必要地从一个地方复制到另一个地方。

最佳答案

使用您的代码,我们需要复制“repl”列以使两个子集数据集相等,然后像您一样分配值

 val <- df2$repl[match(df1$subj, df2$subj)][row(df1[mycols])][is.na(df1[mycols])]
df1[mycols][is.na(df1[mycols])] <- val
df1
# subj a b c
#1 1 5 5 1
#2 1 2 3 5
#3 2 0 6 2
#4 3 8 8 8

使用data.table的另一个选项

 library(data.table)#v1.9.5+
DT <- setDT(df1, key='subj')[df2[c('subj', 'repl')]]
for(j in mycols){
i1 <- which(is.na(DT[[j]]))
set(DT, i=i1, j=j, value= DT[['repl']][i1])
}
DT[,repl:= NULL]
# subj a b c
#1: 1 5 5 1
#2: 1 2 3 5
#3: 2 0 6 2
#4: 3 8 8 8

或者使用dplyr

 library(dplyr)
left_join(df1, df2, by='subj') %>%
mutate_each_(funs(ifelse(is.na(.),repl,.)), mycols) %>%
select(a:c)
# a b c
#1 5 5 1
#2 2 3 5
#3 0 6 2
#4 8 8 8

数据

 df1 <-  structure(list(subj = c(1L, 1L, 2L, 3L), a = c(NA, 2L, 0L, 8L 
), b = c(NA, 3L, NA, 8L), c = c(1L, 5L, 2L, 8L)), .Names = c("subj",
"a", "b", "c"), class = "data.frame", row.names = c(NA, -4L))

df2 <- structure(list(subj = 1:3, repl = c(5L, 6L, 40L),
notinterested = c(1000L,
0L, 10L)), .Names = c("subj", "repl", "notinterested"),
class = "data.frame", row.names = c(NA, -3L))

关于R 有条件地通过查找替换更多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31045512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com