on
联接的data.table
子句是否可以支持比不等式更多的涉及表达式?例如,如果我尝试执行
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)))
似乎也无济于事。
我总是可以通过在一个或两个输入中添加一个额外的列来解决此问题(在这种情况下为la name_upper := toupper(name)
),然后在连接后删除不需要的列,但这很麻烦且麻烦。
是否可以在此处实现类似SQL连接功能的功能?
答案 0 :(得分: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