2012-11-21 49 views
11

只是不知道是否有一个有效的方式做到外与数据表连接,如外连接data.table [R

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,] 
+0

在第一种情况下,'a'和'b'是不加键的,所以'merge'需要先键入它们(作为本地拷贝(种类)),因为它不想改变'a'和' b'在调用范围内)。在第二种情况下,你很乐意通过键入它们来改变'a'和'b'(你是否有时间这么做?),然后'a [b]'快。但即使如此,我惊讶有很大的差异。合并_应该与'x [y]'相当。在谈论计时时请注明版本信息:您是否在v1.8.6上?而且你的“非常快”和“非常慢”可能是我的“相似”的想法!什么是实际时间? –

+0

这很容易导致严重/不恰当的基准测试,因此我们绝对需要在说出任何内容之前查看您的计时方法。 –

+0

我无法为此提供时间,因为第一次爆炸在记忆中并且撞毁了R会话(加入了大约19米线)。我会用一个较小的集合对它进行基准测试并发布结果。 (版本1.8.2,我正在使用) – jamborta

回答

10

b[a,]是您要查找的“外连接”。

更多细节请看?merge.data.table

+0

谢谢!所以[b,]或b [a,]本质上是一个左连接(用SQL术语来说)?我一直认为它是一个内部联接。 – jamborta

+0

@jamborta查看常见问题解答2.16('nomatch = 0 | NA') –

+1

感谢马修,这解释了它。我认为这样你不能做全外连接(只留下外部和内部)? – jamborta