2017-02-12 88 views
0

我試圖用數據框x2和x3的數值的平均值代替數據框x1的多個列中的NA值,基於公共和不同的atrribute'ID'。用其他數據幀的平均值代替多個列的數字

所有dataframes(每個數據幀是特定年份)具有相同的列結構:

ID A B C ..... 

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

我已經找到了答案在同一時間做1列,這要歸功於this post

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

這可能不會導致錯誤,但'ifelse'的最後一個參數應該是x而不是'x1 $ x'。 – lmo

回答

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 
} 
相關問題