2017-07-10 66 views
1

我有以下兩種data.tables如何有條件地替換合併後的R data.table列?

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 data.table與

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

所得data.table是:

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,如果它們不是NA。大部分的價值觀都是一樣的,但那些不是的(例如鳥/企鵝)應該被替換。

一個人可以這樣做一個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中的另一列有條件地替換一列的值?簡單地用一個替換另一個,忽略NA的效率更高嗎?

+0

像'DT [is.na(column1.y),column1.x:!= column1.y]'? – SymbolixAU

回答

2

我們可以使用on基礎的方法

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

有沒有必要合併data.tables呢? – ShanZhengYang

+1

@ShanZhengYang這是一個'join',我假設給出了預期的輸出,而不需要在輸入數據中創建額外的列 – akrun