【发布时间】:2013-08-08 00:44:33
【问题描述】:
我的列表中有大约 40K 数据帧。每个数据框有 7 个变量、3 个因子和 4 个数值。作为参考,这里是第一个数据框:
$ a:'data.frame': 4 obs. of 7 variables:
..$ x1 : Factor w/ 1 level "a": 1 1 1 1
..$ x2 : Factor w/ 4 levels "12345678901234",..: 1 2 3 4
..$ x3 : Factor w/ 4 levels "SAMPLE",..: 1 2 3 4
..$ x4 : int [1:4] 1 2 3 4
..$ x5 : num [1:4] 10 20 30 40
..$ x6: int [1:4] 50 60 70 80
..$ x7 : num [1:4] 0.5 0.7 0.35 1
我正在尝试将这些合并到一个巨大的数据框中,使用:
Reduce(function(...) merge(..., all=T), df_list)
这里推荐:Simultaneously merge multiple data.frames in a list。
如果我取前 1000 个项目,即
Reduce(function(...) merge(..., all=T), df_list[1:1000])
这会产生所需的结果(将各个数据帧合并为一个)并在 37 秒内完成。
但是,在整个 40K 数据帧列表上运行 Reduce() 会花费过多的时间。我让它运行超过 5 小时,但它似乎没有完成。
有什么技巧可以用来提高Reduce() 的性能,还是有更好的选择?
【问题讨论】:
-
请问40k数据框有多少行?
-
你确定要
merge他们,而不是rbind他们,就像do.call(rbind, df_list)一样吗? -
它因每个 df 而异,但所有数据帧的观察总数刚刚超过一百万。
-
100 万行,7 列并不是那么多。 @flodel 的
do.call(rbind, df_list)应该可以解决问题... -
你可以从
data.table尝试rbindlist而不是rbind(尽管有些事情你必须手动处理 reg.data-type)。
标签: r performance dataframe reduce