R rbind:连接嵌套列表的每个元素

cic*_*ioz 2 r list dataframe

我在尝试连接作为 R 中列表列表元素的 data.frames 时遇到了困难。我已经使用 for 循环实现了第一个原始解决方案,但是(当然)随着长度的增加它变得非常慢列表增长。

(更新:我已将元素“消息”添加到每个嵌套列表中)

这里的示例代码:

list1 = list()
list1[[1]] = list(df = data.frame(A = 1 : 10, B = 30 : 21), 
                  message = "first list")
list1[[2]] = list(df = data.frame(A = 11 : 20, B = 20 : 11), 
                  message = "second list")
list1[[3]] = list(df = data.frame(A = 21 : 30, B = 30 : 21), 
                  message = "third list")

dfFinal = data.frame()
for(nIndexList in 1 : length(list1)) {
  dfFinal = rbind(dfFinal, list1[[nIndexList]]$df)
}
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法来做到这一点(例如,矢量化)?

mar*_*kus 5

更新

根据新要求——每个子列表现在包含一个数据框一个向量——我们必须过滤data.frames

do.call(rbind, c(Filter(is.data.frame, unlist(list1, recursive = FALSE)),
                 make.row.names = FALSE))
Run Code Online (Sandbox Code Playgroud)

初始答案(每个子列表仅包含一个单一的数据帧)

您可以使用unlistwith 参数recursive = FALSE然后do.call(rbind, ...)

do.call(rbind, c(unlist(list1, recursive = FALSE), make.row.names = FALSE))
#    A  B
#1   1 30
#2   2 29
#3   3 28
#4   4 27
#5   5 26
#6   6 25
#7   7 24
#8   8 23
#9   9 22
#10 10 21
#11 11 20
# ...
Run Code Online (Sandbox Code Playgroud)

make.row.names = FALSE也传递给rbind


如果速度是一个问题,您可能会使用 data.table

data.table::rbindlist(unlist(list1, recursive = FALSE))
Run Code Online (Sandbox Code Playgroud)

一种tidyverse方法是

dplyr::bind_rows(purrr::flatten(list1))
Run Code Online (Sandbox Code Playgroud)