假设我们在数据帧df1中确实有很多数据列(名称为mycols,还有一些未命名的数据列,在这种情况下不应该处理),并且列subj也是列repl和subj的另一个数据帧df2的索引(在第二个数据帧是唯一的)和许多其他不重要的列(它们的唯一作用是,我们不能假设只有2列)。

我想以这种方式替换列的子集(df1 [,mycols]),如果存在NA(df1 [,mycols] [is.na(df1 [,mycols])])
编辑:示例数据(我不知道将其写为数据帧分配的命令):

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进行相同的操作(如果不适用,请查看表df2并替换-替换值在行范围内相同)。

(此外,我还需要用mycols明确地命名为everythime来枚举列,因为可能还会有其他列)

作为编程风格的一个附加问题,这是一个小小的问题-在R中,写此操作的一种好又快的方法是什么?如果这是一种程序语言,我们可以改变

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


我认为这种方法更美观,更易读:

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


并确保没有不必要的复制。

最佳答案

使用您的代码,我们需要replicate'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 - R有条件地通过查找替换更多列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31045512/

10-12 13:53