我正在 R 中学习 data.table。这个连接让我困惑了几个小时。有人可以帮我理解吗?
library(data.table)
DT = data.table(x = rep(c("b", "a", "c"), each = 3),
y = c(1, 3, 6),
v = 1:9)
DT
#> x y v
# 1: b 1 1
# 2: b 3 2
# 3: b 6 3
# 4: a 1 4
# 5: a 3 5
# 6: a 6 6
# 7: c 1 7
# 8: c 3 8
# 9: c 6 9
X = data.table(x = c("c", "b"),
v = 8:7,
foo = c(4, 2))
X
#> x v foo
# 1: c 8 4
# 2: b 7 2
Run Code Online (Sandbox Code Playgroud)
而这个加入结果超出了我的范围。
DT[X, on = .(x, y <= foo)]
#> x y v i.v
# 1: c 4 7 8
# 2: c 4 8 8
# 3: b 2 1 7
Run Code Online (Sandbox Code Playgroud)
它在做什么?
连接尝试匹配左 ( DT) 和右 ( X) 表的行。
哪些行应该匹配?
on告诉我们两个条件,总是先左后右
x, 的简写x == x,即DT$x == X$xy <= foo方法DT$y <= X$foo。另请注意,我们使用右表来“查找”左表的行。这意味着我们要遍历 的行X并查看哪些行DT匹配。
让我们从 开始X[1]。匹配哪几行DT?
X[1]$x是c。(7,8,9)有3个对应行DT。X[1]$foo是4。有6行对应DT(1,2,4,5,7,8)有 2 行满足这两个条件:7、8。
现在我们移动到X[2]. 匹配哪几行DT?
X[2]$x是b。(1,2,3)有3个对应行DT。X[2]$foo是2。DT(1,4,7)有3个对应行只有一行满足这两个条件:7。
所以输出有 3 行,2 匹配X[1]和 1 匹配X[2]。
这告诉我们有关行的信息 - 现在我们需要考虑结果中将包含哪些列。
该查询未指定任何列,因此默认情况下包含两个表中的所有列。x默认情况下,并且y将来自X(y来自X$foo),因为它们是连接条件的一部分。上存在碰撞v(它同时存在于DT和中X),因此我们v从左侧(即DT$v)和i.v右侧(即x$v)获得。
这是一个非对等连接:
b和c在这种情况下,DT$y <= X$foo或许这样更容易理解:
DT[X,.(x.x, x.y, x.v, i.x, i.v, i.foo,`y < foo`= x.y < i.foo ), on = .(x = x, y <= foo)]
x.x x.y x.v i.x i.v i.foo y < foo
1: c 1 7 c 8 4 TRUE
2: c 3 8 c 8 4 TRUE
3: b 1 1 b 7 2 TRUE
Run Code Online (Sandbox Code Playgroud)
在哪里:
x.是LHS表的列( DT)i.是RHS表 ( X)的列,要记住i.考虑DT[i,j,by].| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |