这是我的数据:
df1 <- data.frame(x = 1:5, y = letters[1:5])
df2 <- data.frame(x = 1:15, y = letters[1:15])
df3 <- data.frame(x = 1:25, y = letters[1:25])
df4 <- data.frame(x = 1:6, y = letters[1:6])
df5 <- data.frame(x = 1:8, y = letters[1:8])
l1 <- list(df1, df2)
l2 <- list(df3, df4, df5)
mylist <- list(l1, l2)
我想在mylist中计算所有数据帧中x列的平均值,并将它们放入一个新的空列表(或向量)中,如下所示:
mean_vec <- c(
mean(df1$x),
mean(df2$x),
mean(df3$x),
mean(df4$x),
mean(df5$x)
)
另一种可能的解决方案,基于purrr::map_depth
:
library(tidyverse)
map_depth(mylist, 2, ~ mean(.x$x)) %>% unlist
#> [1] 3.0 8.0 13.0 3.5 4.5
或者使用rrapply::rrapply
,由于@Maël的评论,现在更短的解决方案,我感谢谁:
library(rrapply)
library(magrittr)
rrapply(mylist, condition = is.numeric, f = mean, how = "unlist") %>% unname
#> [1] 3.0 8.0 13.0 3.5 4.5
您可以unlist
您的嵌套列表并计算每个的平均值:
mean_vec <- sapply(unlist(mylist, recursive = F), function(dat) mean(dat$x))
mean_vec
# [1] 3.0 8.0 13.0 3.5 4.5
rapply
的另一个选项:
mean <- rapply(mylist, mean)
unname(mean[names(mean) == "x"])
# [1] 3.0 8.0 13.0 3.5 4.5
purrr
解决方案
library(purrr)
library(dplyr)
mylist %>%
map_depth(., 2, ~ .x %>% summarise(mean = mean(x, na.rm = T))) %>%
bind_rows() %>%
pull()