data.table join 很难理解

Ste*_*eve 0 r data.table

我正在 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)

它在做什么?

Mic*_*ico 6

连接尝试匹配左 ( DT) 和右 ( X) 表的行。

哪些行应该匹配?

on告诉我们两个条件,总是先左后右

  1. x, 的简写x == x,即DT$x == X$x
  2. y <= foo方法DT$y <= X$foo

另请注意,我们使用右表来“查找”左表的行。这意味着我们要遍历 的行X并查看哪些行DT匹配。

让我们从 开始X[1]。匹配哪几行DT

  • X[1]$xc。(7,8,9)有3个对应行DT
  • X[1]$foo4。有6行对应DT(1,2,4,5,7,8)

有 2 行满足这两个条件:7、8。

现在我们移动到X[2]. 匹配哪几行DT

  • X[2]$xb。(1,2,3)有3个对应行DT
  • X[2]$foo2DT(1,4,7)有3个对应行

只有一行满足这两个条件:7。

所以输出有 3 行,2 匹配X[1]和 1 匹配X[2]

这告诉我们有关行的信息 - 现在我们需要考虑结果中将包含哪些列。

该查询未指定任何列,因此默认情况下包含两个表中的所有列。x默认情况下,并且y将来自Xy来自X$foo),因为它们是连接条件的一部分。上存在碰撞v(它同时存在于DT和中X),因此我们v从左侧(即DT$v)和i.v右侧(即x$v)获得。


Wal*_*ldi 5

这是一个非对等连接:

  • 加入这两个表相同的X:bc在这种情况下,
  • 只保留 DT 的值,其中 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].