在非等额联接中使用.SD
时,我发现不一致。
对此有解释吗?
根据连接的“方向”或“类型”,使用j = .SD
会引发错误。
library(data.table)
d1 <- fread("a, b
1, 11
6, 16")
d2 <- data.table(r = 1:5, s = seq(0, 20, 5))
d1
a b 1: 1 11 2: 6 16
d2
r s 1: 1 0 2: 2 5 3: 3 10 4: 4 15 5: 5 20
d1[d2, on = .(a <= s, b >= s)]
a b r 1: 0 0 1 2: 5 5 2 3: 10 10 3 4: 10 10 3 5: 15 15 4 6: 20 20 5
d1[d2, on = .(a <= s, b >= s), j = .SD]
[.data.table
中的错误(d1,d2,on =。(a <= s,b> = s),j = .SD):
找不到列:a
d2[d1, on = .(s >= a, s <= b)]
r s s.1 1: 2 1 11 2: 3 1 11 3: 3 6 16 4: 4 6 16
d2[d1, on = .(s >= a, s <= b), j = .SD]
r s 1: 2 1 2: 3 1 3: 3 6 4: 4 6
我已复制了R版本3.6.0和data.table
版本1.11.8、1.12.2和1.12.3(github上的开发版本)的行为。
我知道在github上有相关的讨论,例如Both columns for rolling and non-equi joins #3093,.SD in expression with j? #3115,但是我没有找到(也许被忽略了?)那里观察到的行为的解释。
答案 0 :(得分:0)
感谢阿伦和马特,issue已经fixed (note item 24)有了data.table
1.12.3的最新开发版本。
所以
d1[d2, on = .(a <= s, b >= s), j = .SD]
不再抛出错误,而是返回
a b 1: 0 0 2: 5 5 3: 10 10 4: 10 10 5: 15 15 6: 20 20
符合预期。