【问题标题】:Fast and Efficient Way to merge a lot of dataframe in R在 R 中合并大量数据帧的快速有效的方法
【发布时间】:2017-05-05 02:06:53
【问题描述】:

我有大量数据框(大约 50,000 个)。每个数据框有两列,键和值,大约有 100-200 行。我的问题本质上类似于thisthis。按照他们的想法,我构建了一个数据框列表并使用了Reduce函数

freq_martix<-Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "key", all = TRUE),
                    freq_list)

但是我的代码已经运行了好几天。我只是想知道是否有更有效、更快的方法来合并大量数据帧?

【问题讨论】:

  • 如果每个数据框中只有一个键和值,那么你真的需要在键上合并吗?你不能只连接数据框吗?还是每个数据框中的值是不同类型的测量?
  • 每个数据帧可能有重叠的键。更重要的是,每个数据框代表每个文件,因此,我需要合并数据框中的列(从第 2 列开始)来表示原始文件。谢谢。
  • 你的代码运行多长时间来合并两个data.frames?
  • 你的数据框大小是多少?
  • @DingLi:连接可能仍然是一种选择,例如为每个单独的数据框添加一列df$source = current_source。然后使用bind_rows() 之类的东西连接所有单独的帧,如果需要,最后重新整形。它可能比合并更快,因为每次都不需要查找密钥,但如果不了解数据就很难说。

标签: r performance dataframe merge memory-efficient


【解决方案1】:

这种方式非常快。 首先,我创建了 500 个表,每个表包含 150 个键值对。

library(data.table)
library(stringi)

for (i in 1:500) {
  set.seed(i)
  dfNam <- paste('df', i, sep = '_')
  df <- data.frame( cbind(key = tolower(stri_rand_strings(150, 1, pattern = '[A-Za-z]')), value = sample(1:1000, 150, replace = TRUE)) )
  assign(dfNam, df)
  rm(df)
  rm(dfNam)
}

然后我转置并附加它们:

tmp <- data.table()
for (i in ls(pattern = 'df_') ) {
  df <- get(i)
  dt <- data.table( transpose(df) )
  colnames(dt) <- as.character(unlist(dt[1, ]))
  dt <- dt[-1, ]
  tmp <- rbindlist(list(tmp, dt), use.names = TRUE, fill = TRUE)
}

毕竟又转回来了:

merged_data <- transpose(tmp)
key <- colnames(tmp)
merged_data <- cbind(key, merged_data)

像魅力一样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多