如何在计算平均值时摆脱NA?

tem*_*mor 1 r

b=c(1,4,3,NA)
c=c(NA,4,3,8)
res=(b+c)/2
NA 4 3 NA
Run Code Online (Sandbox Code Playgroud)

你可以看到每当我们得到NA返回的结果时NA.我想计算b and c两者之间的平均值,如果两者都有值,但是如果两者b or c都有NA,则只返回值b or c.期望的结果将是:

res
1 4 3 8
Run Code Online (Sandbox Code Playgroud)

akr*_*run 7

我们可以使用rowMeans 后,cbind荷兰国际集团的矢量"B","C"来创建一个matrix. rowMeans有options(na.rm = TRUE)来处理NA值.

rowMeans(cbind(b,c), na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)

或者colMeansrbind矢量之后.

colMeans(rbind(b,c), na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)

假设我们有矩阵而不是向量,我们仍然可以rowMeans/colMeans循环遍历其中一个数据集的列/行(假设它们具有相同的维度).例如,

b <- matrix(c(1,4,3, NA, 2, 3, NA, 2), ncol=2)
c <- matrix(c(NA, 4, 3, 8, 1, NA, 3, 4), ncol=2)
Run Code Online (Sandbox Code Playgroud)

我们循环虽然列顺序(seq_len(ncol(b)))用sapply,cbind"B"和"C",并获得相应的列rowMeans.输出将matrix与初始矩阵具有相同的维度.

m1 <- sapply(seq_len(ncol(b)), function(i)
             rowMeans(cbind(b[,i], c[,i]), na.rm=TRUE))
m1
#   [,1] [,2]
#[1,]    1  1.5
#[2,]    4  3.0
#[3,]    3  3.0
#[4,]    8  3.0
Run Code Online (Sandbox Code Playgroud)

另一个选择而不是循环是用NA两个数据集替换元素0.我们可以使用replace它,+根据NA每个位置的元素数量进行划分.

m2 <- (replace(b, which(is.na(b)), 0) + replace(c, which(is.na(c)), 0))
m2/(2-(is.na(b)+is.na(c)))
#      [,1] [,2]
#[1,]    1  1.5
#[2,]    4  3.0
#[3,]    3  3.0
#[4,]    8  3.0
Run Code Online (Sandbox Code Playgroud)

使用NAerfrom 可以使上述代码更紧凑library(qdap)

library(qdap)
(NAer(b) + NAer(c))/(2-(is.na(b)+is.na(c)))
#  1   2
#1 1 1.5
#2 4 3.0
#3 3 3.0
#4 8 3.0
Run Code Online (Sandbox Code Playgroud)