合并两个`data.table`对象

时间:2015-02-09 12:20:18

标签: r statistics data.table

我有两个数据集,我想将第二个数据集映射到第一个数据集:

n <- c(2, 3, 5,6,7,8) 
s <- c("aa", "bb", "cc","aa", "bb", "cc") 
b <- c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE) 
df <- data.table(n, s, b) 

rs <- c("aa", "bb", "cc") 
replace1 <- c("Product 1", "Product 2", "Product 3") 
replace2 <- c("Customer 1", "Customer 2", "Customer 3") 

df.replace <- data.table(rs, replace1, replace2) 

所以基本上如果df中的aaProduct 1,我想添加一个Customer 1data.table的列。

此外,我还使用{{1}}包来提高速度,因为我的文件大小都超过2 GB。映射文件以及我必须将值映射到的文件。

如何在R?

中实现这一点的任何建议

更新

我想要的输出:

enter image description here

1 个答案:

答案 0 :(得分:4)

您只需使用data.table二进制联接来执行正确加入

setkey(df, s) # key `df` by `s`
(Res <- df[df.replace]) # Perform the binary join
#    n  s     b  replace1   replace2
# 1: 2 aa  TRUE Product 1 Customer 1
# 2: 6 aa FALSE Product 1 Customer 1
# 3: 3 bb FALSE Product 2 Customer 2
# 4: 7 bb  TRUE Product 2 Customer 2
# 5: 5 cc  TRUE Product 3 Customer 3
# 6: 8 cc FALSE Product 3 Customer 3

修改

或(根据您的评论)您还可以使用二进制加入左连接

setkey(df.replace, rs) # key `df.replace` by `rs`
setkey(df, s) # key `df` by `s`
(Res <- df.replace[df])
#    rs  replace1   replace2 n     b
# 1: aa Product 1 Customer 1 2  TRUE
# 2: aa Product 1 Customer 1 6 FALSE
# 3: bb Product 2 Customer 2 3 FALSE
# 4: bb Product 2 Customer 2 7  TRUE
# 5: cc Product 3 Customer 3 5  TRUE
# 6: cc Product 3 Customer 3 8 FALSE

使用此联接,如果df.replace中的值不匹配,则不会从df中删除行并将NA分配给相关列


更好的选择(如果df.replace中没有太多列)是通过引用df来分配这些值。这样,您无需在任何地方保存结果,df将自行更新。

setkey(df, s) # key `df` by `s`
df[df.replace, 
         `:=`(replace1 = replace1, 
              replace2 = replace2)
   ] # Perform the binary join and save results in `df`