我们可以在cbinding 向量'b'、'c' 之后使用rowMeans 来创建matrix。 rowMeans 具有处理 NA 值的选项 (na.rm = TRUE)。
rowMeans(cbind(b,c), na.rm=TRUE)
或colMeans 在rbind 处理向量之后。
colMeans(rbind(b,c), na.rm=TRUE)
假设如果我们有矩阵而不是向量,我们仍然可以在遍历数据集之一的列/行之后执行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)
我们循环遍历列序列 (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
替代循环的另一种选择是将两个数据集中的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
使用NAer from 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