2017-02-12 5 views
0

データフレームx1の複数の列のNA値を、共通の異なる属性値「ID」に基づいてデータフレームx2とx3の値の平均で置き換えようとしています。私はthis postに、感謝を一度に1列にそれを行うための答えを見つけた複数の列のNAを他のデータフレームの平均値と置き換えます。

ID A B C ..... 

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

すべてのデータフレームは、(各データフレームは、特定の年のためである)同じ列構造を有しています。

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カ月を持っているので、私はそれを行うよりスマートな方法を持っていると思っています。 私は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の初心者です。論理を複数の列に適用する際に、どこが間違っているのかを教えてください。

+0

これはおそらくエラーの原因ではありませんが、 'ifelse'の最後の引数は' x1 $ x'ではなく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 
} 
関連する問題