2017-03-22 8 views
-1

replace NA value with the group valueは答えが似ていますが、以下の答えはdata.tableを使用してより洗練されています。重複したタグを取り除くにはどうすればいいですか?これは間違いなく私が "ID" で定義されたグループとのグループの値に応じてNAを塗りつぶします。

library(data.table) 
test <- data.table(id=c(1,1,1,2,2,2,3,3,3), A=c("Val1","Val1", NA, "Val2", NA, NA, NA, NA, "Val3"), B=c(1,NA,NA, 2,2,NA,NA,NA,3)) 
test 
    id A B 
1: 1 Val1 1 
2: 1 Val1 NA 
3: 1 NA NA 
4: 2 Val2 2 
5: 2 NA 2 
6: 2 NA NA 
7: 3 NA NA 
8: 3 NA NA 
9: 3 Val3 3 

のようなdata.tableを持ってReplacing NAs with latest non-NA value

のない重複していないYOU

に感謝します。

NA-Valuesにそのグループの値を入力したいとします。あなたは解決策を見ますか?

結果は(文字と数字の機能については)次のようになります。

id A B 
1: 1 Val1 1 
2: 1 Val1 1 
3: 1 Val1 1 
4: 2 Val2 2 
5: 2 Val2 2 
6: 2 Val2 2 
7: 3 Val3 3 
8: 3 Val3 3 
9: 3 Val3 3 

はありがとうございました。

+2

を削除した後に、データセットに参加するかにそれを(:=)を割り当てますグループ。 '$ a、test $ id、FUN = function(x)x [!is.na(x)])'と 'ave(テスト$ B、テスト$ id、FUN = function(x)x [ is.na(x)]) ' –

答えて

2

'A'と 'B'列の 'id'ごとに一意の要素しかないと仮定し、 'id'でグループ化した後、Data.table(.SD)のサブセットをループし、 NA要素と列

test[, (2:3) := lapply(.SD, function(x) x[!is.na(x)][1]) , id] 

それともあなたはすべてのために同じ非NA値を持っていると仮定するとNA行

test[na.omit(test), names(test)[-1] := mget(paste0("i.", names(test)[-1])) , on = .(id)] 
関連する問題