【问题标题】:How to get rid of NA when computing the average? [duplicate]计算平均值时如何摆脱NA? [复制]
【发布时间】:2015-11-19 03:18:19
【问题描述】:
b=c(1,4,3,NA)
c=c(NA,4,3,8)
res=(b+c)/2
NA 4 3 NA

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

res
1 4 3 8

【问题讨论】:

  • 首先使用函数rowMeans,其次使用na.rm=T

标签: r


【解决方案1】:

我们可以在cbinding 向量'b'、'c' 之后使用rowMeans 来创建matrixrowMeans 具有处理 NA 值的选项 (na.rm = TRUE)。

rowMeans(cbind(b,c), na.rm=TRUE)

colMeansrbind 处理向量之后。

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))) 与 sapplycbind 对应的 '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

【讨论】:

  • 谢谢@akrun 如果b 是一个矩阵而c 是一个矩阵。我们如何应用您的解决方案?事实上,我的真实数据是矩阵,但我举了一个简单的例子。
  • @temor 取决于b的维度。你能更具体一点吗?假设nrow(b) 是否与clength 相同。然后我们可以cbind 两者都得到rowMeans。如果ncol(b)clength 相同,我们rbind 它。
  • b 的维度与 c 相似。 b 的暗淡是 1000 col * 500 行,c 的暗淡是 1000 col * 500 行。
  • @temor 试试sapply(seq_len(ncol(b)), function(i) rowMeans(cbind(b[,i], c[,i]), na.rm=TRUE))
猜你喜欢
  • 1970-01-01
  • 2019-08-19
  • 2015-09-12
  • 2021-09-05
  • 2015-04-14
  • 1970-01-01
  • 2019-02-07
相关资源
最近更新 更多