使用 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
我有三个 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