使用 R 计算缺失数据的平均矩阵

Average Matrices with missing data using R

我有三个 108x108 矩阵,我想从中计算它们的平均矩阵。矩阵中缺少数据,我想将其排除在单元格平均值的计算之外。如果三个矩阵中只有两个日期条目,则应为该单元格计算两个现有条目的平均值。下面是一个例子。必须有一个命令可以轻松地用 NA 对矩阵进行平均?

Matrix 1: 

3  3  3

NA 3  3

Matrix 2: 

3  3  3

3  3  3

Matrix 3: 

3  3  3

3  3  3

Average Matrix:

3  3  3

3  3  3

“平均 <- (a + b + c)/3”由于缺少数据条目而无效。 "mean" 似乎不适合平均矩阵。

希望有人能指路!提前谢谢你。

# create sample data reproducibly
m1 = m2 = m3 = matrix(3, 2, 3)
m1[2, 1] = NA

# put your matrices in an array
a = array(c(m1, m2, m3), dim = c(dim(m1), 3))

# apply the `mean` function with `na.rm = TRUE`
apply(a, 1:2, mean, na.rm = TRUE)
#      [,1] [,2] [,3]
# [1,]    3    3    3
# [2,]    3    3    3

以下是三个基本解决方案:

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的个数。我们可以交替使用动物园的 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

BaseR,

matrix(rowMeans(matrix(rbind(m,k,l),ncol=3),na.rm=T),2)

给予,

     [,1] [,2] [,3]
[1,]    3    3    3
[2,]    3    3    3

数据:

m <- matrix(3,2,3)
k <-  matrix(3,2,3)
l <-  matrix(3,2,3)
m[2,1] <- NA