【问题标题】:outer join data.table R外连接data.table R
【发布时间】:2012-11-09 16:42:20
【问题描述】:

只是想知道是否有一种有效的方法可以对数据表进行外部连接,例如

a <- data.table(a=c(1,2,3),b=c(3,4,5))
b <- data.table(a=c(1,2),k=c(1,2))
merge(a,b,by="a",all.x=T)

这工作正常,但它不如内连接高效,因为下面的运行速度非常快,但上面的速度真的很慢。

setkey(a,a)
setkey(b,a)
a[b,]

【问题讨论】:

  • 在第一种情况下,ab 未键入,因此 merge 需要先键入它们(作为本地副本(有点)在合并中,因为它不想更改ab 在调用范围内)。在第二种情况下,您很乐意通过键入它们来更改ab(您是否包括了这样做的时间?)然后a[b] 很快。但即便如此,我还是很惊讶有很大的不同。 merge 应该x[y]相当。请在谈论时间时说明版本信息:您在 v1.8.6 上吗?而且您的“非常快”和“非常慢”可能是我对“相似”的想法!实际时间是多少?
  • 基准测试很容易出错/不恰当,所以我们绝对需要先看看你的计时方法,然后再说。
  • 我无法为此提供时间,因为第一个在内存中爆炸并导致 R 会话崩溃(加入大约 19m 行)。我将用较小的集合对其进行基准测试并发布结果。 (版本 1.8.2,我正在使用)
  • 这在较小的集合上会很棒。当意外请求笛卡尔连接时,我们经常看到用户报告 merge 爆炸(基本合并以及 data.table 合并)。也许我们可以在其中设置一些陷阱来帮助检测和捕获错误的使用。只是一个猜测。似乎人们有时会在实际需要 cbind 时尝试使用 merge

标签: r data.table


【解决方案1】:

b[a,] 是您正在寻找的“外部连接”。

查看?merge.data.table 了解更多详情。

【讨论】:

  • 谢谢!所以 a[b,] 或 b[a,] 本质上是左连接(用 SQL 术语)?我一直认为它是一种内部连接。
  • @jamborta 请参阅常见问题解答 2.16 (nomatch = 0|NA)
  • 感谢 Matthew,这解释了这一点。我假设这种方式你不能做完全外连接(只有左外和内)?
  • @jamborta 正确。但是你可以为左或右做X[Y]Y[X]。它源自 by-without-by 特性(类似于 SQL 中的 CROSS APPLY 和 OUTER APPLY)。这个想法是ji 的每一行运行。这在完整的外部连接上下文中没有意义。如果需要完全外连接,那么merge 可以做到这一点。话虽如此,它即将出现,并且已请求更多连接类型in this detailed question,这是要考虑的列表。
  • 有没有比merge.data.table更快的全外连接替代方案?
猜你喜欢
  • 2019-10-20
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多