以下是三个基本解决方案:
1) 使用注释中可重现的输入,最后使用mapply,然后将结果重新整形为矩阵。
Mean <- function(...) mean(c(...), na.rm = TRUE)
replace(m1, TRUE, mapply(Mean, m1, m2, m3))
## [,1] [,2] [,3]
## [1,] 3 3 3
## [2,] 3 3 3
2) 使用 sapply 创建一个矩阵,每个输入矩阵有一列,然后对给出向量的行进行平均。将其重新整形为矩阵。
L <- list(m1, m2, m3)
replace(L[[1]], TRUE, rowMeans(sapply(L, c), na.rm = TRUE))
## [,1] [,2] [,3]
## [1,] 3 3 3
## [2,] 3 3 3
3) 将 NA 替换为 0 并求和,然后除以非 NA 的数量。我们可以交替使用 zoo 的 na.fill(x, 0) 将 x 中的 NA 替换为 0 代替 na2zero。
na2zero <- function(x) ifelse(is.na(x), 0, x)
Sum <- function(L, f) Reduce("+", lapply(L, f))
Sum(L, na2zero) / Sum(L, Negate(is.na))
## [,1] [,2] [,3]
## [1,] 3 3 3
## [2,] 3 3 3
3a) 或者写出来而不是使用 Reduce:
(na2zero(m1) + na2zero(m2) + na2zero(m3)) /
((!is.na(m1)) + (!is.na(m2)) + (!is.na(m3)))
## [,1] [,2] [,3]
## [1,] 3 3 3
## [2,] 3 3 3
注意
m1 <- m2 <- m3 <- matrix(3, 2, 3)
m1[2, 1] <- NA