【问题标题】:More robust expression in join clause of data.table join?data.table 连接的连接子句中更健壮的表达式?
【发布时间】:2019-04-30 18:03:38
【问题描述】:

data.table 连接的 on 子句是否可以支持比 (in) 等式更多的表达式?例如,如果我尝试执行

B[A,on=.(name = toupper(name))]

B[A,on=.(year = year(date))]

我收到错误消息

[.data.table(B, A, on = .(name = toupper(name))) 中的错误: 在 i 中找不到列 [toupper(name)]

data.table 似乎正在寻找名称为未计算表达式的列,而不是计算表达式。用 name = eval(quote(toupper(name))) 之类的东西替换 name = toupper(name) 似乎也没有帮助。

我总是可以通过在一个或两个输入中添加一个额外的列(在这种情况下为name_upper := toupper(name))然后在连接后删除不需要的列来解决这个问题,但这既笨重又麻烦。

这里可以实现类似 SQL 连接的功能吗?

【问题讨论】:

    标签: r join data.table


    【解决方案1】:

    你可以试试这样的:

    样本数据

    DT <- data.table( id = 1:3, name = c("John", "JOHN", "Steve"), stringsAsFactors = FALSE)
    
       id  name
    1:  1  John
    2:  2  JOHN
    3:  3 Steve
    

    代码

    DT[copy(DT)[, NAME := toupper(name)], id2 := i.id, on = .(name = NAME)][]
    

    输出

       id  name id2
    1:  1  John  NA
    2:  2  JOHN   2
    3:  3 Steve  NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      相关资源
      最近更新 更多