想知道是否有一种有效的方法可以在数据表格中进行外连接操作,例如:
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 <- 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,]
b[a,]
是你正在寻找的 "outer join"。
更多具体信息请看 ?merge.data.table
。
nomatch = 0|NA
)。 - Matt DowleX[Y]
或 Y[X]
来表示左或右。它源自于“按-不按”特性(类似于 SQL 中的 CROSS APPLY 和 OUTER APPLY)。这个想法是,j
对于 i
的每一行都会运行。在全外连接的情况下,这没有意义。如果需要全外连接,那么就可以使用 merge
。话虽如此,越来越多的连接类型被要求,在这个详细的问题中提出了这个问题(https://dev59.com/bWcs5IYBdhLWcg3wh0f7),这个问题已经列入考虑范围。 - Matt Dowlemerge.data.table
更快的全外连接替代方案? - Moysey Abramowitz
a
和b
是未键掉的,所以merge
需要先将它们键掉(作为本地副本(有点像)存储在合并内部,因为它不想改变调用范围内的a
和b
)。在第二种情况下,您已经通过键掉它们来更改了a
和b
(您是否包括执行此操作的时间?),然后a[b]
很快。但即使如此,我还是很惊讶有如此大的差异。merge
应该与x[y]
相当可比。请在讨论时间时说明版本信息:您使用的是v1.8.6吗?而且,您的“非常快”和“非常慢”可能是我认为“相似”的想法!实际时间是多少? - Matt Dowlemerge
(包括基本合并和 data.table 合并)在意外请求笛卡尔积时会出现错误。也许我们可以在其中设置一些陷阱来帮助检测和捕捉不正确的用法。只是一个猜测。似乎有时人们尝试使用merge
,而实际上他们需要的是cbind
。 - Matt Dowle