为数据帧列表循环 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::map
和dplyr::bind_rows
加入新列表的data.frame。
library(tidyverse)
transpose(list(dataset1, dataset2, dataset3)) %>%
map(bind_rows)
我们可以使用
pmap(list(dataset1, dataset2, dataset3), ~ rbind(...) %>%
as.data.frame)
我有 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::map
和dplyr::bind_rows
加入新列表的data.frame。
library(tidyverse)
transpose(list(dataset1, dataset2, dataset3)) %>%
map(bind_rows)
我们可以使用
pmap(list(dataset1, dataset2, dataset3), ~ rbind(...) %>%
as.data.frame)