【发布时间】:2016-10-24 17:47:06
【问题描述】:
我想知道是否有一种内存有效的方式来连接 n 个 data.tables(或数据帧)。例如,如果我有以下 4 个 data.tables:
df1 = data.table(group = c(1L,2L,3L),value = rnorm(3),key = "group")
df2 = data.table(group = c(2L,1L,3L),value2 = rnorm(3),key = "group")
df3 = data.table(group = c(3L,2L,1L),value3 = rnorm(3),key = "group")
df4 = data.table(group = c(1L,3L,2L),value4 = rnorm(3),key = "group")
我可以像这样合并它们:
merge(df1,merge(df2,merge(df3,df4)))
但这似乎不是最佳解决方案。我可能有许多需要合并的 data.tables。有没有办法在不将每个连续合并复制到内存的情况下概括上述内容?在 data.table 之外是否有一种已经被接受的方式来执行此操作?
【问题讨论】:
-
一种解决方案是将所有数据框放在一个列表中,然后使用
Reduce()合并它们。见stackoverflow.com/questions/8091303/… -
Reduce(function(x, y) x[y], list(df1, df2, df3, df4))在您提供的数据上似乎要快一些,但您必须在更大的输入上对其进行测试才能看到它的扩展性。 -
@ulfelder 这只是语义糖。将进行相同的合并操作。
-
这取决于你的实际应用。如果您的合并变量在所有表中完全匹配,就像这里一样,那么只需复制 cols
-
我想您需要考虑很多问题。 Matthew 所做的重新安排本身并不是一个真正的问题——只是在复制之前
setorder。如果您知道每个group值最多出现在一行中,那么您可以制作最终表格(每组一行),然后执行一堆合并分配。如果您知道每个表只有一个额外的列(此处为value*模式),那么您可以rbindlist它们然后重塑......我想还有其他情况。
标签: r data.table data-manipulation