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

时间:2016-03-16 13:51:26

标签: r dplyr

我有一份data.frames R列表的列表,我希望将它们绑定在一起。这是一个例子:

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为止?

2 个答案:

答案 0 :(得分:1)

这个怎么样:

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
#..   ...

答案 1 :(得分:0)

试试这个函数::

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