理解data.table左连接

问题描述 投票:0回答:1

我在

data.table
文档https://cran.r-project.org/web/packages/data.table/data.table.pdf中阅读了以下内容:

X[DT, on="x"] # left join

并且,使用这个例子:

A <- data.table("a"=1:4, "b"=12:15)
B <- data.table("a"=2:3, "b"=13:14)
B[A, on='a']

我得到:

   a  b i.b
1: 1 NA  12
2: 2 13  13
3: 3 14  14
4: 4 NA  15

我想了解这里到底发生了什么。事情的顺序是什么? 在我看来,我们正在上面连接中的

B
范围内工作,所发生的情况是,我们针对
A
中的每一行检查
B
中是否存在与
on
标准匹配的匹配项。如果存在一个匹配或多个匹配,则此/这些索引/索引将被“存储”,然后我们继续前进到
B
的下一行,依此类推。 但我只是不明白当没有匹配时会发生什么。当我们在 B 的
scope
context
内操作时,为什么要从 A 中“带来”一行(第一行和最后一行)? 像这样的连接是否不仅仅是匹配
on
中的内容,以便返回一些索引/索引,然后将其应用于
B

r join data.table
1个回答
0
投票

您实际上是在使用该代码执行

right outer join
。如果你在代码中交换 A 和 B,你就能看出区别。

A <- data.table::data.table("a"=1:4, "b"=12:15)
B <- data.table::data.table("a"=2:3, "b"=13:14)
A[B, on='a']
       a     b   i.b
   <int> <int> <int>
1:     2    13    13
2:     3    14    14

此链接将对其进行更多解释(如果它在 2024 年之后仍保持活动状态) R加入

您正在将外部数据表附加到内部数据表。因此,在您的示例中,您将匹配从 B 到 A 的行。这就是为什么您在连接后最终在 A 中得到 NA 的原因。我的示例表明,相反,您只从 A 中取出与 B 中匹配的两行。

© www.soinside.com 2019 - 2024. All rights reserved.