2017-07-10 21 views
1

私はマージ時に条件付きでR data.table列を置き換える方法は?

merged = merge(dt1, dt2, by="index_column", all=TRUE) 

結果data.tableでのみ共有index_columnにdata.tableこれら二つをマージする際、次の2 data.tables

library(data.table) 

dt1 = data.table(index_column = c(12, 17, 29, 34, 46), column1 = c("dog", "cat", "bird", "elephant", "bird"), column2 = c(482, 391, 567, 182, 121)) 

dt2 = data.table(index_column = c(17, 29, 46), column1 = c("cat", "penguin", "bird")) 

> dt1 
    index_column column1 column2 
1:   12  dog  482 
2:   17  cat  391 
3:   29  bird  567 
4:   34 elephant  182 
5:   46  bird  121 


> dt2 
    index_column column1 
1:   17  cat 
2:   29 penguin 
3:   46 bird 

を持っているのです。

index_column column1.x column2 column1.y 
1:   12  dog  482  NA 
2:   17  cat  391  cat 
3:   29  bird  567 penguin 
4:   34 elephant  182  NA 
5:   46  bird  121  bird 

私はcolumn1.xの値をcolumn1.yの値に置き換えることに興味があります(0でない場合)。値の大部分は同じですが、そうでないもの(例:鳥/펭귄)は交換する必要があります。

これはif文になります。

if ((merged$column1.x != merged$column1.y) & !is.na(merged$column1.y)){ 
    merged$column1.x = merged$column1.y 
} 

merged$column1.y = NULL 

私の懸念は、これは非常にdata.table解決策ではないということです。 data.tableに何百万行もある場合は、うまく拡張できません。

R data.tableの別の列に基づいて1つの列の値を条件付きで置き換えるにはどうすればよいでしょうか? NAを無視して、単に一方を他方に置き換える方が効率的ですか?

+0

'DTのようなものをonベースのアプローチを使用することができますか'? – SymbolixAU

答えて

2

我々は[!、is.na(column1.y)column1.x:= column1.y]

dt1[dt2, column1 := i.column1, on = .(index_column)] 
dt1 
# index_column column1 column2 
#1:   12  dog  482 
#2:   17  cat  391 
#3:   29 penguin  567 
#4:   34 elephant  182 
#5:   46  bird  121 
+0

データテーブルをマージする必要はありませんか? – ShanZhengYang

+1

@ShanZhengYang入力データに追加の列を作成せずに期待される出力を与えると仮定した 'join'です – akrun

関連する問題