如何在data.frames的列表列表上递归地调用dplyr中的bind_rows?

0sgqnhkj  于 2023-04-18  发布在  其他
关注(0)|答案(3)|浏览(109)

我在R中有一个data.frames的列表列表列表,我想把它们绑定在一起。下面是一个例子:

tmp <- list(
    list(
        list(
            data.frame(x = 1:5),
            data.frame(x = 6:10)
            ),
        list(
            data.frame(x = 11:15),
            data.frame(x = 16:20)
            )
    ),
    list(
        list(
            data.frame(x = 21:25),
            data.frame(x = 26:30)
            ),
        list(
            data.frame(x = 31:35),
            data.frame(x = 36:40)
            )
        )
    )

bind_rows(
    bind_rows(lapply(tmp[[1]], bind_rows)),
    bind_rows(lapply(tmp[[2]], bind_rows))
    )

很明显这是一个混乱,所以我希望有一个更好的方法,也许有一些方法可以递归地调用bind_rows,这样它就可以一直向下遍历列表,直到找到一个data.frame来绑定。

6kkfgxo0

6kkfgxo01#

不如这样:

Reduce(dplyr::bind_rows, unlist(unlist(tmp, FALSE), FALSE)) 

#Source: local data frame [40 x 1]
#
#       x
#   (int)
#1      1
#2      2
#3      3
#4      4
#5      5
#6      6
#7      7
#8      8
#9      9
#10    10
#..   ...
tjjdgumg

tjjdgumg2#

试试这个函数::

bind_rows <- function(lst){
    if(class(lst[[1]]) == "data.frame") {
        return(data.table::rbindlist(lst))
    } else {
        bind_rows(unlist(lst, recursive = FALSE))
    }
}
dm7nw8vv

dm7nw8vv3#

collapse软件包有一个函数:

library(collapse)
unlist2d(tmp, idcols = F) 

# Or if you want add add an ID column for each list level
unlist2d(tmp)

或者使用dplyr来替代你的答案......这仍然很难看:

tmp %>%
  lapply(bind_rows) %>%
  lapply(bind_rows) %>%
  lapply(bind_rows) %>%
  bind_rows

相关问题