我目前正在使用以下代码来合并> 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行,其中许多行对于该表是唯一的。因此,通过合并多个表,可以快速获得合并数据帧的行数到数百万个。
最后,我会从我的大合并表中删除总计数太低的行,但是我不想在合并期间这样做,因为我的文件顺序会很重要..
答案 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