【问题标题】:Join datatables using more than one column name stored in one variable使用存储在一个变量中的多个列名连接数据表
【发布时间】:2019-03-06 16:27:08
【问题描述】:

我正在尝试对两个数据表执行更新连接,其中包含我需要用于连接存储在变量中的字段(多个)。下面是一个例子:

library(data.table)
DT1 <- data.table(col1 = 1:5, col2 = 5:1, lett = letters[1:5])
DT2 <- data.table(col1 = c(1:3, 2:5, 1), col2 = c(5:3, 4:1, 5))

joinFields <- c('col1', 'col2')

我试过这样做:

DT1[DT2,
    on=c(paste0(joinFields, '=', joinFields)),
    nomatch=0L]

这种方式基于Join datatables using column names stored in variables中建议的解决方案。

dt1[dt2_temp, 
    on=c(paste0(varName, ">valueMin"), paste0(varName, "<=valueMax")),
    nomatch=0L]

它不起作用。显然,我的情况有点不同,因为在我使用的示例中,有 2 个粘贴。是否有继续允许我使用on = c() 的解决方案?

编辑:我知道我可以用merge()`来做到这一点

【问题讨论】:

  • 您提到“更新加入”,但不要使用:=。您能否展示并解释所需的输出?顺便说一句,我猜你可能需要"==" 而不是"=",例如DT1[DT2, on=sprintf("%s==%s", joinFields, joinFields)]
  • 用于连接的键在两个表中似乎相同,所以为什么不 DT1[DT2, on=joinFields, nomatch=0L] 呢?
  • @Frank,感谢您的建议。它确实不是更新连接。我有点懒,从另一个线程复制。我应该添加let := i.lett
  • @chinsoon12,谢谢这是一个非常简短的解决方案

标签: r data.table


【解决方案1】:

我觉得你只需要放两个==,如下:

DT1[DT2,
    on=c(paste0(joinFields, '==', joinFields)),
    nomatch=0L]
# col1 col2 lett
# 1:    1    5    a
# 2:    2    4    b
# 3:    3    3    c
# 4:    2    4    b
# 5:    3    3    c
# 6:    4    2    d
# 7:    5    1    e
# 8:    1    5    a

即使你不需要使用c()

 DT1[DT2,
        on=paste0(joinFields, '==', joinFields),
        nomatch=0L]
    # col1 col2 lett
    # 1:    1    5    a
    # 2:    2    4    b
    # 3:    3    3    c
    # 4:    2    4    b
    # 5:    3    3    c
    # 6:    4    2    d
    # 7:    5    1    e
    # 8:    1    5    a

【讨论】:

  • 非常感谢@Carles Sans Fuentes。我必须说我有一些事情要研究,因为我不明白为什么它可以与 == 运算符一起使用。我一般是这样加入的DT1[DT2, on = .(col1 = col1, col2 = col2), nomatch=0L]
  • @koteletje 这只是on= 中字符串的记录行为(来自?data.table
  • 很高兴帮助@koteletje。我们都需要检查员工。关于你为什么它是两个等于的问题:除了在data.table 文档中这样说明之外,检查一个对象/某物是否与另一个对象/某物完全相等的标准方法是使用逻辑运算符,它被建立为两个等于。检查此链接以进一步了解它:statmethods.net/management/operators.html
猜你喜欢
  • 2018-12-13
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多