【问题标题】:Join two data tables and use only one column from second dt连接两个数据表并仅使用第二个 dt 中的一列
【发布时间】:2015-09-03 23:20:32
【问题描述】:

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

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

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          

【问题讨论】:

  • 您想要对dt1 进行左连接并添加一个新列,或者您只是想要一个外连接并创建一个新数据集?如果您正在寻找第一个选项,请尝试setkey(setDT(dt1), A) ; dt1[dt2, H := i.H]
  • 我试图澄清我的问题。我想保留 dt1 中的所有行和列。我只想从 dt2 添加一列。谢谢
  • 那你为什么要创建df3呢?另外,我的解决方案不适合您吗?它应该完全满足您的需求。
  • 忽略 dt3 (试图让我的例子更干净)。您的解决方案有效!非常感谢...只是一个问题,为什么我们不需要为 dt2 设置密钥?是不是因为我们默认使用dt2的第一列加入?
  • 是的,完全正确。不过,如果您愿意,可以通过 E 键入 df2 以确保安全。

标签: r join merge data.table


【解决方案1】:

为了对df1 执行左连接并从df2 添加H 列,您可以将二元连接更新结合起来通过引用运算符 (:=)

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

请参阅 herehere 了解其工作原理的详细说明


使用开发版本 (v >= 1.9.5),我们可以通过在 setDT 中指定 key 来缩短它(正如 @Arun 所指出的那样)

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

2015 年 7 月 24 日编辑

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

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

【讨论】:

  • 你能帮我理解“i.H”的用法吗?
  • @Chris i. 只是告诉 data.table 在您进行连接时从哪里获取列。如果我们有X[Y],那么Y 表位于Xs i 位置。这在两个表都有同名的列时很有用。
  • @DavidArenburg 这些链接已损坏。无论如何只保留来自 dt1 的列?
  • @HermanToothrot 不确定您的意思。此解决方案已仅保留来自 dt1 的列。
  • @DavidArenburg 抱歉我不清楚,我只想保留 dt1 的列,不保留 dt2 的列。
【解决方案2】:

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")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 2020-06-29
    • 1970-01-01
    • 2018-05-05
    • 2023-04-05
    • 2021-10-13
    • 2021-10-26
    • 2021-09-30
    相关资源
    最近更新 更多