加速合并R中的许多数据帧

时间:2016-05-31 16:49:06

标签: r performance dataframe merge

我目前正在使用以下代码来合并> 130个数据框,并且代码需要花费太多时间才能运行(实际上我从未在这样一个大数据集上完成,仅在子集上完成)。每个表格有两列:单位(字符串)和计数(整数)。我是按单位合并的。

tables <- lapply(files, function(x) read.table(x), col.names=c("unit", x))))

MyMerge <- function(x, y){
  df <- merge(x, y, by="unit", all.x= TRUE, all.y= TRUE)
  return(df)
}

data <- Reduce(MyMerge, tables)

有没有办法轻松加快速度?每个表/数据框分别有大约500,000行,其中许多行对于该表是唯一的。因此,通过合并多个表,可以快速获得合并数据帧的行数到数百万个。

最后,我会从我的大合并表中删除总计数太低的行,但是我不想在合并期间这样做,因为我的文件顺序会很重要..

1 个答案:

答案 0 :(得分:3)

这是一个小比较,首先是一个相当小的数据集,然后是一个较大的数据集:

JFileChooser

这给出了以下结果:

library(data.table)
library(plyr)
library(dplyr)
library(microbenchmark)

# sample size: 
n = 4e3

# create some data.frames:
df_list <- lapply(1:100, function(x) {
  out <- data.frame(id = c(1:n), 
                    type = sample(c("coffee", "americano", "espresso"),n, replace=T))
  names(out)[2] <- paste0(names(out)[2], x)
  out})

# transform dfs into data.tables:
dt_list <- lapply(df_list, function(x) {
  out <- as.data.table(x)
  setkey(out, "id")
  out
})

# set options to outer join for all methods:    
mymerge <- function(...) base::merge(..., by="id", all=T)
mydplyr <- function(...) dplyr::full_join(..., by="id")
myplyr <- function(...) plyr::join(..., by="id", type="full")
mydt <- function(...) merge(..., by="id", all=T)

# Compare:
microbenchmark(base = Reduce(mymerge, df_list),
               dplyr= Reduce(mydplyr, df_list),
               plyr = Reduce(myplyr, df_list),
               dt = Reduce(mydt, dt_list), times=50)

我们可以看到两位参赛者是Unit: milliseconds expr min lq mean median uq max neval cld base 944.0048 956.9049 974.8875 962.9884 977.6824 1221.5301 50 c dplyr 316.5211 322.2476 329.6281 326.9907 332.6721 381.6222 50 a plyr 2682.9981 2754.3139 2788.7470 2773.8958 2812.5717 3003.2481 50 d dt 537.2613 554.3957 570.8851 560.5323 572.5592 757.6631 50 b dplyr。将样本大小更改为5e5会产生以下比较,表明确实data.table占主导地位。请注意,我在@BenBolker的建议之后添加了这部分。

data.table