【问题标题】:How to rbind many (+1000) *.rds files fast [duplicate]如何快速绑定许多(+1000)* .rds 文件[重复]
【发布时间】: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


【解决方案1】:

您的第一次尝试似乎很接近。稍作修改后,以下内容对我有用

mergedat <- do.call('rbind', lapply(list.files("dat/", full.names = TRUE), readRDS))

我唯一添加的是full.names = TRUE

【讨论】:

  • OP 并没有说它不起作用。 OP 说完成需要时间。
  • 谢谢,但我建议的这两个工作。他们只是需要很长时间。有什么办法可以加快速度?
  • 好的,知道了。原帖有错别字,我会在那里评论。
  • 也许我应该删除这个答案,然后 Gregor 应该将建议移至“答案”以获得信用。
  • 哇,这是一篇旧帖子,但您可以使用 dplyr::bind_rows,它更快。
猜你喜欢
  • 1970-01-01
  • 2014-03-31
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 2014-02-06
  • 2018-02-07
相关资源
最近更新 更多