我有这样的list
:
(mylist <- list(a = data.frame(x = c(1, 2), y = c(3, 4)),
b = data.frame(x = c(2, 3), y = c(4, NA)),
c = data.frame(x = c(3, 4), y = c(NA, NA))))
$a
x y
1 1 3
2 2 4
$b
x y
1 2 4
2 3 NA
$c
x y
1 3 NA
2 4 NA
由purrr::map()
创建的。如何计算相应单元格中的值均值?即
x y
1 2 3.5
2 3 4
其中
mean(c(1, 2, 3), na.rm = T) # = 2
mean(c(2, 3, 4), na.rm = T) # = 3
mean(c(3, 4, NA), na.rm = T) # = 3.5
mean(c(4, NA, NA), na.rm = T) # = 4
感谢您的帮助!
答案 0 :(得分:2)
一种方法是将列表转换为数组,然后将平均值函数应用于数组的第三维:
my_array <- array(unlist(mylist), dim=c(2,2,3))
apply(my_array, c(1,2), mean, na.rm=T)
# [,1] [,2]
# [1,] 2 3.5
# [2,] 3 4.0
如果您想一次性完成所有操作,而无需对尺寸进行硬编码,则可以执行以下操作:
apply(array(unlist(mylist), dim=c(nrow(mylist[[1]]),ncol(mylist[[1]]),length(mylist))), c(1,2), mean, na.rm=T)
答案 1 :(得分:1)
一个purrr
选项
library(purrr)
map_df(transpose(mylist), ~rowMeans(as.data.frame(.x), na.rm = TRUE))
# A tibble: 2 x 2
# x y
# <dbl> <dbl>
#1 2 3.5
#2 3 4
答案 2 :(得分:1)
Reduce(function(x, y) x + replace(y, is.na(y), 0), mylist)/
Reduce(`+`, lapply(mylist, function(x) !is.na(x)))
# x y
#1 2 3.5
#2 3 4.0
OR
nm = c("x", "y") # could do `nm = names(mylist[[1]])`
sapply(nm, function(NM)
rowMeans(do.call(cbind, lapply(mylist, function(x) x[NM])), na.rm = TRUE))
# x y
#[1,] 2 3.5
#[2,] 3 4.0