在R中计算列表中每个数据框的均值,并将其赋值给一个新向量

3

这是我的数据:

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)
)
3个回答

3

基于 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

1
如果你只有一个函数,例如 rrapply(mylist, condition = is.numeric, f = mean, how = "unlist"),那么你不需要每次都加上 \(x)。 - Maël
1
感谢您评论我的回答,@Maël!您说得完全正确!我已经相应地更新了我的答案。 - PaulS

1
您可以将嵌套列表进行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

0
一个 purrr 的解决方案
library(purrr)
library(dplyr)

mylist %>%
  map_depth(., 2, ~ .x %>% summarise(mean = mean(x, na.rm = T))) %>%
  bind_rows() %>%
  pull()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接