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连接功能的模拟?
你可以尝试这样的事情:
样本数据
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