我在
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
?
您实际上是在使用该代码执行
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 中匹配的两行。