私は定期的に、data.frameの欠損値を別のレベルの集計にある他のdata.frameの値に置き換える必要がある状況があります。たとえば、郡データがいっぱいのdata.frameがある場合、別のdata.frameに格納された状態値でNA値を置き換えることができます。同じ書いた後にmerge
... ifelse(is.na())
ヤダヤダ数十回私はこれを行うために機能を書き留めて書くことに決めました。ここであるdata.frameのNaAsを別のdata.frameの値で置き換える関数の作成
は、私はそれを使用する方法の例と一緒に、私は調理ものです:
fillNaDf <- function(naDf, fillDf, mergeCols, fillCols){
mergedDf <- merge(naDf, fillDf, by=mergeCols)
for (col in fillCols){
colWithNas <- mergedDf[[paste(col, "x", sep=".")]]
colWithOutNas <- mergedDf[[paste(col, "y", sep=".")]]
k <- which(is.na(colWithNas))
colWithNas[k] <- colWithOutNas[k]
mergedDf[col] <- colWithNas
mergedDf[[paste(col, "x", sep=".")]] <- NULL
mergedDf[[paste(col, "y", sep=".")]] <- NULL
}
return(mergedDf)
}
## test case
fillDf <- data.frame(a = c(1,2,1,2), b = c(3,3,4,4) ,f = c(100,200, 300, 400), g = c(11, 12, 13, 14))
naDf <- data.frame(a = sample(c(1,2), 100, rep=TRUE), b = sample(c(3,4), 100, rep=TRUE), f = sample(c(0,NA), 100, rep=TRUE), g = sample(c(0,NA), 200, rep=TRUE))
fillNaDf(naDf, fillDf, mergeCols=c("a","b"), fillCols=c("f","g"))
私は、このランニングを得たので、後に、私は誰かが、おそらく私の前に、この問題を解決し、Aでいることを、この奇妙な感じがしましたはるかにエレガントな方法。この問題には、より良い/より簡単な/より速い解決策がありますか?また、関数の途中でループを削除する方法はありますか?そのループはそこにあります。なぜなら、私はしばしば、複数の列でNAを置き換えているからです。そして、はい、関数は、我々が記入している列がからまで同じであると仮定し、我々はからまでを記入している列をマージに適用します。
ガイダンスやリファクタリングが役立ちます。
EDIT 12月2日私が修正した私の例には論理的な欠陥があることが分かりました。
クール。いくつかの解説はそれを理解するのに役立つかもしれません。それは簡潔に見える! :) –
OK - 少しコメントしました。もっと学ぶことに興味があるならば、 '?data.table'の 'Examples'セクションは典型的なもので、作業に20分ほどかかるでしょう。特に、あなたが大規模なデータを扱う人なら、それはあなたのように見えますが、それは実際には最善の時間を投資する価値があります。 –
ありがとうございました。それは本当に役に立ちます。 –