我正在尝试将数据帧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 post和here的建议。 我提出了这个代码,但无法使其正常工作。
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的新手,我肯定会感谢一些指导,让我知道我哪里出错了,将逻辑应用于多列。
答案 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
}