【发布时间】:2012-10-27 18:02:36
【问题描述】:
我知道可以将两个data.table 与merge 函数或[.data.table 函数合并(加入)。但是,如果我说 10, data.tables 并想使用 do.call 将它们合并在一起,是否有一个函数可以做到这一点?目前我求助于do.call(cbind, ...),它只适用于非常特殊的情况。
【问题讨论】:
标签: r join merge data.table
我知道可以将两个data.table 与merge 函数或[.data.table 函数合并(加入)。但是,如果我说 10, data.tables 并想使用 do.call 将它们合并在一起,是否有一个函数可以做到这一点?目前我求助于do.call(cbind, ...),它只适用于非常特殊的情况。
【问题讨论】:
标签: r join merge data.table
不确定,但可能(未经测试):
Reduce(merge,list(DT1,DT2,DT3,...))
【讨论】:
mymerge = function(x,y) merge.data.table(x,y,all=TRUE) 这样的包装器,然后将该包装器传递给Reduce,即Reduce(mymerge,list(DT1,DT2,DT3,...))。
data.tables 未加密,则包装器应类似于 function(x, y) x[y, on = "merge_column_name"]
要充实 cmets 中 @Henk 建议的解决方案,以下是如何使用它在简洁的公式中选择 all = TRUE 选项:
MergedDT = Reduce(function(...) merge(..., all = TRUE), List_of_DTs)
【讨论】:
最新版本的data.table (1.10.5) 有一个简单的表连接语法,也可以链式连接。
set(DT1, key)
set(DT2, key)
...
set(DT10, key)
DT_cmb <- DT1[DT2,][DT3,]...[DT10,]
【讨论】:
data.table,它可能会很详尽。可能有一种简单(且更通用)的方法可以使用 lapply 和 ls(pattern = '^DT') 来代替。
lapply() 和setkeyv( ),特别是因为我已经希望列表中的data.tables 使用我的首选merge syntax
对于 Michael Ohlrogge 的新回答,我在这里创建了一个函数来执行此任务。你可以从merge.data.table()继承更多参数
mergeDTs <- function(dt_list, by = NULL, sort = FALSE) {
Reduce(
function(...) {
merge(..., by = by, all = TRUE, sort = sort)
}, dt_list)
}
【讨论】: