加入两个数据表并仅使用第二个 dt 中的一列

Join two data tables and use only one column from second dt

假设我有两个数据 tables(dt1 和 dt2),我想使用数据 tables 获取 dt3。 A、B、C、E、F、G、H 是列名。 dt1 key是A列,dt2 key是E列。数据tables有不同的行数。我想保留 DT1 中的所有列,并仅将 DT2 中的一列 (H) 添加到连接数据 table。最终,我会将其存储为 DT1(尽管我在下面将其显示为 dt3)。

如何使用数据 tables 实现它?我有一个合并+数据框的丑陋解决方案。

dt1 
A   B   C   
1   4   7   
2   5   8   
3   6   9   
2   20  21

dt2
E   F   G   H
1   10  13  16
3   12  15  18    
2   11  14  17


dt3
A   B   C   H
1   4   7   16
2   5   8   17
3   6   9   18
2   20  21  17          

为了对 df1 执行 左联接 并从 df2 添加 H 列,您可以组合 binary joinupdate by reference 运算符 (:=)

setkey(setDT(dt1), A) 
dt1[dt2, H := i.H]

有关其工作原理的详细说明,请参阅 here and here


在开发版本 (v >= 1.9.5) 中,我们可以通过在 setDT 中指定 key 来使其更短(正如@A运行 所指出的)

setDT(dt1, key = "A")[dt2, H := i.H]

编辑 24/7/2015

您现在可以 运行 使用新的 on 参数进行二进制联接而无需设置键

setDT(dt1)[dt2, H := i.H, on = c(A = "E")]

data.table解决方案

setDT(dt1)[ , H := dt2$H[match(dt1$A , dt2$E)] , ]

#    A  B  C  H
# 1: 1  4  7 16
# 2: 2  5  8 17
# 3: 3  6  9 18
# 4: 2 20 21 17

另一种 dplyr 解决方案是

left_join(x = dt1 , y = dt2 , by = c("A" = "E")) %>% 
select(one_of(c("A" , "B" , "C" , "H")))