2016-10-11 13 views
1

2つのdata.tableがあります。私は右をしたいRでデータテーブルを結合した後、不一致の行のNA値を置き換えます

dt1 <- data.table(id=seq(1, 4), col1=1:4, col2=1:4, col3=1:4) 
dt2 <- data.table(id=seq(1, 5), val=c("a", "b", "c", "d", "e")) 

dt <- merge(dt1, dt2, all.y=TRUE, by="id") 

のように参加するが、結果は

id col1 col2 col3 val 
1 1 1 1 a 
2 2 2 2 b 
3 3 3 3 c 
4 4 4 4 d 
5 0 0 0 e 

する必要があります0 での結果でNASに置き換える私は、内の列の多くを持っていますdata.tableので、私はそれらを1つずつ変更したくありません。これを行う効率的な方法はありますか?

+1

改善のため[open FR](https://github.com/Rdatatable/data.table/issues/857)があります – jangorecki

答えて

3

代わりに新しいテーブルを作成するのは、あなただけdt1からdt2へのcolsを追加することを検討かもしれません:あなたは本当に新しいテーブルをしたい場合は

cols = setdiff(names(dt1), "id") 
dt2[dt1, on="id", (cols) := mget(paste0("i.", cols))] 
dt2[!dt1, on="id", (cols) := 0 ] 

    id val col1 col2 col3 
1: 1 a 1 1 1 
2: 2 b 2 2 2 
3: 3 c 3 3 3 
4: 4 d 4 4 4 
5: 5 e 0 0 0 

が、しかし、あなたが行うことができます

cols = setdiff(names(dt1), "id") 
z = dt1[dt2, on="id"] 
z[!dt1, on="id", (cols) := 0 ] 

    id col1 col2 col3 val 
1: 1 1 1 1 a 
2: 2 2 2 2 b 
3: 3 3 3 3 c 
4: 4 4 4 4 d 
5: 5 0 0 0 e 

パッケージメンテナーは、ジョインにビネットを書き込む予定です。

関連する問題