【问题标题】:na.rm and is.na give different answersna.rm 和 is.na 给出不同的答案
【发布时间】:2015-04-02 02:26:17
【问题描述】:

我刚刚遇到一个简单的问题,但我不明白发生了什么。我正在使用 R 删除 NA 值并计算简单的汇总统计信息,但 is.na 和 na.rm 给了我不同的答案。

如果我有一个向量

> test<-c(NA, NA,NA, 1,2,3,4)

我用 na.rm = TRUE 计算平均值,得到 c(1,2,3,4) 的正确平均值。

> mean(test, na.rm=TRUE)
[1] 2.5

如果我重复计算,这次用 !is.na() 删除 NA 值,我会得到错误的答案。

> mean(!is.na(test))
[1] 0.5714286

!is.na(test) 给了我正确的值,但是 R 在这里如何估计平均值?

> !is.na(test)
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE

【问题讨论】:

  • !is.na 并不是要删除 na.values。它向您显示哪些值是NA。改为test[!is.na(test)]
  • 为了进一步澄清这一点,is.na(test) 产生一个向量,R 将其解释为 0 0 0 1 1 1 1,其平均值为 4/7 或 0.57...

标签: r mean na na.rm


【解决方案1】:

!is.na(test) 返回一个逻辑向量。所以,你实际上要求的是:

mean(as.numeric(!is.na(test)))

确实会产生:

## [1] 0.5714286

你需要做的是:

mean(test[!is.na(test)])
## [1] 2.5

或者,正如 Richard Scriven 所补充的:

mean(na.omit(test))

mean(na.exclude(test))

【讨论】:

  • mean(na.omit(test))mean(na.exclude(test))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2019-09-19
相关资源
最近更新 更多