0

我的列表中有大约 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)

如此处推荐:同时合并多个 data.frames in a list

如果我拿前 1000 个项目,即

Reduce(function(...) merge(..., all=T), df_list[1:1000])

这会产生所需的结果(将单个数据帧合并为一个)并在 37 秒内完成。

但是,Reduce()在整个 40K 数据帧列表上运行会花费过多的时间。我已经让它运行超过 5 小时,但它似乎没有完成。

有什么技巧可以用来提高性能Reduce(),还是有更好的选择?

4

1 回答 1

0

如果你真的需要而merge不仅仅是rbind仅剩一个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]])
于 2013-08-06T21:09:16.057 回答