我有一个列表列表,如out。在每个列表中,我都有一个数据帧(具有相同的结构,即相同的变量(。
out <- replicate(4, rep(list(NULL), 2), simplify = FALSE)
我的愿望是将属于第一个列表列表和第二个列表的所有数据帧行绑定在一起(在我最初的练习中,我有超过4个由2个列表组成的列表…对于这个例子,我会做如下操作:
dataframe1 <- rbind(out[[1]][[1]], out[[2]][[1]], out[[3]][[1]], out[[4]][[1]])
dataframe2 <- rbind(out[[1]][[2]], out[[2]][[2]], out[[3]][[2]], out[[4]][[2]])
有没有关于如何迭代并更优雅地做到这一点的想法?
PS:很抱歉没有分享真实数据。
以下是使用rlist
和purr
的方法
do.call(rlist::list.zip, out) %>%
purrr::map(~ do.call(rbind, .))
或者,使用更多purrr
:
library(purrr)
out %>%
do.call(rlist::list.zip, .) %>%
map(~ reduce(., rbind))
当你的框架都是相似或相同的结构,并且你想要相同的"事物;对于所有这些元素,通常最好使用框架列表,而不是单个元素。
out <- replicate(4, rep(list(mtcars[c(1,3),1:3]), 2), simplify = FALSE)
out[[1]][[1]]
# mpg cyl disp
# Mazda RX4 21.0 6 160
# Datsun 710 22.8 4 108
lapply(1:2, function(ind) do.call(rbind, lapply(out, `[[`, ind)))
# [[1]]
# mpg cyl disp
# Mazda RX4 21.0 6 160
# Datsun 710 22.8 4 108
# Mazda RX41 21.0 6 160
# Datsun 7101 22.8 4 108
# Mazda RX42 21.0 6 160
# Datsun 7102 22.8 4 108
# Mazda RX43 21.0 6 160
# Datsun 7103 22.8 4 108
# [[2]]
# mpg cyl disp
# Mazda RX4 21.0 6 160
# Datsun 710 22.8 4 108
# Mazda RX41 21.0 6 160
# Datsun 7101 22.8 4 108
# Mazda RX42 21.0 6 160
# Datsun 7102 22.8 4 108
# Mazda RX43 21.0 6 160
# Datsun 7103 22.8 4 108
如果你已经在使用dplyr
或data.table
,那么它们相对等效,但通常更安全:
lapply(1:2, function(ind) data.table::rbindlist(lapply(out, `[[`, ind), fill = TRUE, use.names = TRUE))
lapply(1:2, function(ind) dplyr::bind_rows(lapply(out, `[[`, ind)))