我在尝试连接作为R中列表列表元素的data.frame时遇到了困难。我已经提出了第一个带有for循环的原始解决方案,但是(当然)随着列表的长度增加。
(更新:我已将元素“ message”添加到每个嵌套列表中)
下面是示例代码:
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)
}
是否有更快的方法(例如矢量化)?
答案 0 :(得分:4)
更新
根据新要求-每个子列表现在都包含一个数据框和一个矢量-我们必须过滤data.frame
s
do.call(rbind, c(Filter(is.data.frame, unlist(list1, recursive = FALSE)),
make.row.names = FALSE))
初始答案(每个子列表仅包含一个单一数据框)
您可以将unlist
与参数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
# ...
make.row.names = FALSE
也传递给rbind
。
如果您担心速度,可以使用data.table
data.table::rbindlist(unlist(list1, recursive = FALSE))
一种tidyverse
的方式
dplyr::bind_rows(purrr::flatten(list1))