合并多个 data.table

55
我知道可以使用 merge 函数或 [.data.table函数来合并(连接)两个 data.table,但是如果我有10个 data.table 并想要使用 do.call 将它们全部合并在一起,是否有一个函数可以做到这一点?目前,我只能使用 do.call(cbind, ...) 适用于非常特殊的情况。
4个回答

68

不确定,但可能是(未经测试):

Reduce(merge,list(DT1,DT2,DT3,...))

3
降维的解决方案很好,但我不知道如何指定all=TRUE。 有什么想法吗? - sdaza
6
好问题。目前我能想到的是创建一个类似于 mymerge = function(x,y) merge.data.table(x,y,all=TRUE) 的包装器,将该包装器传递给 Reduce 函数,即 Reduce(mymerge,list(DT1,DT2,DT3,...)) - Matt Dowle
1
在data.table中,[the all = T]对我很有用,可以同时合并多个数据框。 - Henk
4
如果您的data.table没有设置键值,那么这个包装器应该是这样的:function(x, y) x[y, on = "merge_column_name"] - MichaelChirico

41

为了完善@Henk在评论中提出的解决方案,以下是如何使用该方案以简洁的方式选择all = TRUE选项:

MergedDT = Reduce(function(...) merge(..., all = TRUE), List_of_DTs)

这种方法效果不错,但我也喜欢添加:R Reduce(function(...) merge(..., all=TRUE, sort=FALSE), .)因为允许默认值为TRUE的排序将重新调整到共享键列。如果您创建了一个具有适当键的数据表列表,并且希望在任何共享键上合并它们,则可能会破坏未来的合并。 - jFrostad

8
最新版本的data.table(1.10.5)具有易于使用的表格连接语法,还可以进行链式操作。
 set(DT1, key)
 set(DT2, key) 
  ...
 set(DT10, key)

 DT_cmb <- DT1[DT2,][DT3,]...[DT10,]

1
这个解决方案看起来不错,但如果你有多个data.table的话,它可能会很繁琐。也许,可以使用lapplyls(pattern = '^DT')来更轻松(且更通用)地完成它。 - lcgodoy
@lcgodoy,是的,在这种情况下,我喜欢使用lapply()setkeyv(),特别是因为我已经想要将data.table放在一个列表中,以使用我喜欢的合并语法 - Michael Ohlrogge
这个语法已经存在很久了,链式编程也同样存在很久了,问题在于它不具备可扩展性,因为你可能会有一个数量不同的数据表列表。 - jangorecki

0
根据Michael Ohlrogge的回答,这里我创建了一个函数来完成此任务。你可以从merge.data.table()继承更多参数。
mergeDTs <- function(dt_list, by = NULL, sort = FALSE) {
  Reduce(
    function(...) {
      merge(..., by = by, all = TRUE, sort = sort)
    }, dt_list)
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接