为数据帧列表循环 rbind

looping rbind for lists of dataframes

我有 3 个列表 (dataset1, dataset2, dataset3),每个列表都包含多个不同的数据帧。但是,在每个列表中,数据帧的顺序是相同的(即列表 1、列表 2 和列表 3 中的第一个数据帧具有相同的 headers,第二个、第三个、第四个数据帧等类似。 )

我正在考虑创建一个循环以将 3 个数据帧列表合并为 1 个数据帧列表。由于每个数据帧在所有列表中的顺序相同,我尝试使用以下代码:

library(purr)
combined_data <- pmap(dataset1,
                      dataset2,
                      dataset3,
                      ~rbind(..1,..2,..3))

相反,R 返回了一个错误 "Error: Element 1 has length 51, not 1 or 90."

我检查了一下,所有3个数据集中的第一个数据帧都是"List of 51",而所有3个数据集中的第三个数据帧都是"List of 90"。

然而,当我运行以下代码时:

combined_data <- map2(dataset1,
                      dataset2,
                      ~rbind(.x,.y))
combined_data <- map2(combined_data,
                      dataset3,
                      ~rbind(.x,.y))

它完全按照我想要的方式工作。因此,我想从我的错误中吸取教训,当我使用 pmap 时我的代码是否有任何问题,特别是因为我将来需要经常在多个列表上执行它,并且使用 map2 不会那么可持续。谢谢大家!

您可以使用 purrr::transpose 来切换列表的级别。 这将产生将每个列表中的第一个 data.frame 放入它们自己的列表中,将每个列表中的第二个 data.frame 放入其自己的列表中的效果,依此类推。

然后你可以简单地使用purrr::mapdplyr::bind_rows加入新列表的data.frame。

library(tidyverse)
transpose(list(dataset1, dataset2, dataset3)) %>%
   map(bind_rows)

我们可以使用

pmap(list(dataset1, dataset2, dataset3), ~ rbind(...) %>%
                                               as.data.frame)