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