加入两个数据表并仅使用第二个 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 join 与 update 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")))
假设我有两个数据 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 join 与 update 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")))