循环rbind以获取数据帧列表

时间:2018-06-12 01:53:52

标签: r dataframe purrr

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

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

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

相反,R返回错误“错误:元素1的长度为51,而不是1或90。”

我做了检查,所有3个数据集中的第一个数据帧都是“51个列表”,而所有3个数据集中的第三个数据帧都是“90个列表”。

但是,当我运行以下代码时:

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

它的工作方式与我想要的完全一致。因此,当我使用pmap时,我想从错误中学习我的代码是否有任何问题,特别是因为我将来需要经常在多个列表上执行此操作,并且使用map2将不具有可持续性。谢谢大家!

2 个答案:

答案 0 :(得分:1)

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

然后,您只需使用purrr::mapdplyr::bind_rows加入新列表的data.frames。

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

答案 1 :(得分:0)

我们可以使用

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