【问题标题】:simplifying an arbitrarily long list of data frames into a single data frame [duplicate]将任意长的数据帧列表简化为单个数据帧[重复]
【发布时间】:2013-07-26 02:46:23
【问题描述】:

我有一个结构相同的 csv 文件目录。我正在尝试将它们全部加载到单个 data.frame 中。目前我使用lapply()read.csv() 来获取data.frames 列表,我正在寻找一种优雅的方法来将此列表转换为避免显式循环的data.frame。

lapply(list.of.file.names,read.csv)的结果可以近似为这个结构:

list.of.dfs <- list(data.frame(A=sample(seq(from = 1, to = 10), size = 5),
                               B=sample(seq(from = 1, to = 10), size = 5)), 
                    data.frame(A=sample(seq(from = 1, to = 10), size = 5),
                               B=sample(seq(from = 1, to = 10), size = 5)), 
                    data.frame(A=sample(seq(from = 1, to = 10), size = 5),
                               B=sample(seq(from = 1, to = 10), size = 5))
                    )

以下行的优雅版本适用于任意长度的列表:

one.data.frame <- rbind(list.of.dfs[[1]],list.of.dfs[[2]],list.of.dfs[[3]])

我可以使用 for 循环来做到这一点,但是有基于向量的解决方案吗?

【问题讨论】:

  • do.call(rbind, list.of.dfs)
  • 是的,一旦你知道do.call 做了什么,这会非常简单。
  • 是的,这是重复的。不知怎的,我没有找到更早的那个。笨拙地投票结束我自己的问题。

标签: r


【解决方案1】:

@thelatemail 提到了它,但您可能希望使用以下内容来提高速度:

rbindlist(list.of.dfs)

(需要library(data.table)

【讨论】:

    【解决方案2】:

    do.call 是执行此操作的基本方式。

    do.call(rbind, list.of.dfs)
    

    但是,如果您有很多数据项,以及 S.O. 上的其他讨论,它可能会很慢。集中在如何使用自定义函数或data.tableplyr 包来加快速度。例如:

    Why is rbindlist "better" than rbind?

    Can rbind be parallelized in R?

    Performance of rbind.data.frame

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2022-01-07
      相关资源
      最近更新 更多