将一系列数据框按行组合成一个数据框。

30 浏览
0 Comments

将一系列数据框按行组合成一个数据框。

我有一段代码,在某处会得到一系列数据框(data frame)的列表,我真的想把它们转换为一个大的数据框。

在一个较早之前的问题中,我获得了一些指针,那个问题试图做类似的事情但更复杂。

这是我要开始的一个例子(这是为了说明而被过度简化的):

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)

admin 更改状态以发布 2023年5月23日
0
0 Comments

另一种选择是使用 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", ...) 将是你能找到的最快方法。

编辑1:

基于 Hadley 的评论,下面是来自 CRAN 的最新版本的 rbind.fill

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

这比 rbind 更容易,稍微快一些(这些时间在多次运行中保持不变)。据我所理解,在 github 上的 plyr 版本甚至比这个更快。

0
0 Comments

使用 dplyr 包中的 bind_rows()

bind_rows(list_of_dataframes, .id = "column_label")

0