【问题标题】:Optimize or an alternative to Reduce(merge, list_of_data_frames) in R在 R 中优化或替代 Reduce(merge, list_of_data_frames)
【发布时间】: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


【解决方案1】:

如果您真的需要merge 而不仅仅是rbind,您可以先将它们两两合并(1 和 2、3 和 4、5 和 6 等),然后合并生成的 data.frames 两个2,以此类推,直到只剩下一个 data.frame。

# One step
merge_some <- function(l, ...) {
  n <- length(l)
  k <- floor(n/2)
  result <- list()
  for(i in 1:k) {
    result[[i]] <- merge(l[[2*i-1]], l[[2*i]], ...)
  }
  if( 2*k < n ) {
    result[[k+1]] <- l[[n]]
  }
  result
}

# Sample data
d <- lapply(1:1000, function(i) {
  r <- data.frame(id = sample(1:100,3), v = rnorm(3))
  names(r)[[2]] <- paste0("v",i)
  r
} )

# Iterate until there is only one data.frame left
while( length(d) > 1 ) {
  d <- merge_some(d, by="id", all=TRUE)
} 

# Result
head(d[[1]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2019-10-11
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多