2017-07-10 40 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