data.table join的join子句中更强大的表达式?

问题描述 投票:0回答:1

on加入的data.table条款是否有可能支持更多涉及的表达式而不是(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 = toupper(name)替换name = eval(quote(toupper(name)))似乎也没有帮助。

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

是否有可能在这里实现SQL连接功能的模拟?

r join data.table
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.