合并多个data.tables

Posted

技术标签:

【中文标题】合并多个data.tables【英文标题】:Merging multiple data.tables 【发布时间】:2012-10-27 18:02:36 【问题描述】:

我知道可以将两个data.tablemerge 函数或[.data.table 函数合并(加入)。但是,如果我说 10, data.tables 并想使用 do.call 将它们合并在一起,是否有一个函数可以做到这一点?目前我求助于do.call(cbind, ...),它只适用于非常特殊的情况。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

reduce 解决方案效果很好,但我不知道如何指定 all=TRUE。有什么想法吗? @sdaza 嗯,好问题。我目前所能想到的就是创建一个像mymerge = function(x,y) merge.data.table(x,y,all=TRUE) 这样的包装器,然后将该包装器传递给Reduce,即Reduce(mymerge,list(DT1,DT2,DT3,...)) the all = T 在 data.table 中为我工作。 如果您的 data.tables 未加密,则包装器应类似于 function(x, y) x[y, on = "merge_column_name"]【参考方案2】:

要充实 cmets 中 @Henk 建议的解决方案,以下是如何使用它在简洁的公式中选择 all = TRUE 选项:

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

【讨论】:

【参考方案3】:

最新版本的data.table (1.10.5) 有一个简单的表连接语法,也可以链式连接。

 set(DT1, key)
 set(DT2, key) 
  ...
 set(DT10, key)

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

【讨论】:

这个解决方案看起来不错,但如果您有多个data.table,它可能会很详尽。可能有一种简单(且更通用)的方法可以使用 lapplyls(pattern = '^DT') 来代替。 @lcgodoy 是的,我喜欢在这些情况下使用lapply()setkeyv( ),特别是因为我已经希望列表中的data.tables 使用我的首选merge syntax 这种语法存在很多年,链接也适用于很多年,问题是它无法扩展,因为您可能有一个数量不同的 data.table 列表【参考方案4】:

对于 Michael Ohlrogge 的新回答,我在这里创建了一个函数来执行此任务。你可以从merge.data.table()继承更多参数

mergeDTs <- function(dt_list, by = NULL, sort = FALSE) 
  Reduce(
    function(...) 
      merge(..., by = by, all = TRUE, sort = sort)
    , dt_list)


【讨论】:

以上是关于合并多个data.tables的主要内容,如果未能解决你的问题,请参考以下文章

R从函数返回多个data.tables

给出多个输入,创建标准data.table列

Azure.Data.Tables.TableClient 是线程安全的吗?

将外键上的 SQL 连接转换为 R data.table 语法

excel多个文件合并一个文件怎么做?

如何快速合并多个TXT文件?合并多个TXT文件方法步骤