将数据帧列表转换为一个数据帧

我有一个代码,在一个地方结束了一个数据框列表,我真正想转换成一个大的数据框。

我从一个earlier question的一些指针,试图做类似但更复杂的事情。

这里是我开始的例子(这是大大简化为例证):

listOfDataFrames <- vector(mode = "list", length = 100)

for (i in 1:100) {
    listOfDataFrames[[i]] <- data.frame(a=sample(letters, 500, rep=T),
                             b=rnorm(500), c=rnorm(500))
}

我目前使用这个:

  df <- do.call("rbind", listOfDataFrames)
最佳答案
另一个选项是使用plyr函数:

df <- ldply(listOfDataFrames, data.frame)

这比原来慢一点:

> system.time({ df <- do.call("rbind", listOfDataFrames) })
   user  system elapsed 
   0.25    0.00    0.25 
> system.time({ df2 <- ldply(listOfDataFrames, data.frame) })
   user  system elapsed 
   0.30    0.00    0.29
> identical(df, df2)
[1] TRUE

我的猜测是使用do.call(“rbind”,…)将是最快的方法,你会发现,除非你可以做一些像(a)使用矩阵,而不是data.frames和(b)预分配最终矩阵并分配给它而不是增长它。

编辑1:

基于Hadley的评论,这是最新版本的rbind.fill从CRAN:

> system.time({ df3 <- rbind.fill(listOfDataFrames) })
   user  system elapsed 
   0.24    0.00    0.23 
> identical(df, df3)
[1] TRUE

这比rbind更容易,并且稍微更快(这些时间在多次运行中保持)。据我了解,the version of plyr on github甚至比这更快。

转载注明原文:将数据帧列表转换为一个数据帧 - 代码日志