快速高效的方法在R中合并大量数据帧

时间:2017-05-05 02:06:54

标签: r performance dataframe merge memory-efficient

我有大量的数据帧(大约50,000)。每个数据框都有两列,键和值,大约100-200行。我的问题与thisthis基本相似。根据他们的想法,我构建了一个数据帧列表并使用Reduce函数

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

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

1 个答案:

答案 0 :(得分:0)

这种方式非常快。 首先,我创建了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)

像魅力一样。