我有两个数据表:
library(data.table)
d1 <- data.table(grp = c("a", "c", "b", "a"), val = c(2, 3, 6, 7), y1 = 1:4, y2 = 5:8)
d2 <- data.table(grp = rep(c("a", "b", "c"), 2),
from = rep(c(1, 5), each = 3), to = rep(c(4, 10), each = 3), z = 11:16)
Run Code Online (Sandbox Code Playgroud)
我执行一个非等联接,其中'd1'中的'val'值应该落在每个组'grp'的'from'和'to'''''定义的范围内.
d1[d2, on = .(grp, val >= from, val <= to), nomatch = 0]
# grp val y1 y2 val.1 z
# 1: a 1 1 5 4 11
# 2: c 1 …Run Code Online (Sandbox Code Playgroud) 大家早上好
在data.table我发现使用左连接时,当隐式提及列名时,即不提及表(列所在的表)会导致意外的结果,尽管列名是唯一的。
虚拟数据
x <- data.table(a = 1:2); x
# a
# 1: 1
# 2: 2
y <- data.table(c = 1
,d = 2); y
# c d
# 1: 1 2
Run Code Online (Sandbox Code Playgroud)
左连接在检索列 c 时不提及表名
z <- y[x, on=.(c=a), .(a,c,d)]; z
# a c d
# 1: 1 1 2
# 2: 2 2 NA
Run Code Online (Sandbox Code Playgroud)
查看上述结果时出现问题。c 列的第 2 行应该是NA. 但是,它显示2
这仅在用户明确提及该表时才得到纠正:
z <- y[x, on=.(c=a), .(a,x.c,d)]; z
# a x.c d
# 1: 1 …Run Code Online (Sandbox Code Playgroud)