使用其他数据帧的平均值替换多列的NA

时间:2017-02-12 18:48:33

标签: r replace multiple-columns

我正在尝试将数据帧x1中多列中的NA值替换为数据帧x2和x3中值的平均值,具体取决于常见且不同的属性' ID'

所有数据框(每个数据框都针对特定年份)具有相同的列结构:

ID   A   B   C   .....

01   2   5   7   .....
02   NA  NA  NA  .....
03   5   4   8   .....

由于this post,我找到了一次为1列做到的答案。

x1$A[is.na(x1$A)] <- (x2$A[match(x1$ID[is.na(x1$A)],x2$ID)] + x3$A[match(x1$ID[is.na(x1$A)],x3$ID)])/2

但是因为我有大约100个coulmns来应用它,我真的想有一个更聪明的方法来做到这一点。 我尝试了this posthere的建议。 我提出了这个代码,但无法使其正常工作。

x1[6:105] = as.data.frame(lapply(x1[6:105], function(x) ifelse(is.na(x),  (x2$x[match(x1$ID, x2$ID)]+x3$x[match(x1$ID, x3$ID)])/2, x1$x)))

出现以下错误:

Error in ifelse(is.na(x), (x2$x[match(x1$ID, x2$ID)] + x3$x[match(x1$ID,  :   replacement has length zero 

我最初认为函数(x)在整个列上工作,x表示列名,但我认为它代表每个单独的单元格值,这就是它不能工作的原因。

我是R的新手,我肯定会感谢一些指导,让我知道我哪里出错了,将逻辑应用于多列。

1 个答案:

答案 0 :(得分:0)

for (i in 1:ncol(x1)) {
    nas <- is.na(x1[,i]) # where are NAs
    if (sum(nas)==0) next
    ids <- x1$ID[nas] # ids of NAs
    nam <- colnames(x1)[i] # colname of the column
    x1[nas, i] <- (x2[match(ids, x2$zip), nam] + x3[match(ids, x3$zip), nam]) / 2
}