【发布时间】:2016-04-08 21:00:40
【问题描述】:
我有超过 2000 个 *.rds 文件,包含 18,000 个 obs,我想将它们全部合并到一个 data.frame 中。我知道使用for 循环来增长对象效率不高,并且已经这样做了,但是随着它的进展需要很长时间。有没有更快的方法来做到这一点?
到目前为止,我尝试了以下几件事:
lapply:
mergedat <- do.call(rbind, lapply(list.files("dat/"), readRDS))
for循环:
files <- list.files("dat/")
merged <- data.frame()
for (i in unique(files)){
df <- readRDS(paste0("dat/", i))
merged <- rbind(merged, df)
}
【问题讨论】:
-
在某些极端情况下,引用函数可能会更快(ala
do.call("rbind", ...)。不过,在这种情况下,您是否尝试过dplyr::bind_rows?在我的测试中(使用小型 data.frames),它的运行速度几乎快了一个数量级。 -
@r2evans 我没有尝试过
dplyr选项;我想我也会尝试一下。 -
data.table::rbindlist也值得一试。 -
@Gregor 就是这样。它在不到一分钟的时间内将所有内容与
rbind合并了20多个。谢谢! -
仅供参考,第一个
do.call缺少尾随)
标签: r