na.rm和is.na给出了不同的答案

Jam*_*son 1 r mean na na.rm

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

如果我有一个矢量

> test<-c(NA, NA,NA, 1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

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

> mean(test, na.rm=TRUE)
[1] 2.5
Run Code Online (Sandbox Code Playgroud)

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

> mean(!is.na(test))
[1] 0.5714286
Run Code Online (Sandbox Code Playgroud)

!is.na(测试)给了我正确的值,但R如何估算这里的平均值?

> !is.na(test)
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

hrb*_*str 5

!is.na(test)返回逻辑向量.那么,你实际要求的是:

mean(as.numeric(!is.na(test)))
Run Code Online (Sandbox Code Playgroud)

它确实产生:

## [1] 0.5714286
Run Code Online (Sandbox Code Playgroud)

你需要做的是:

mean(test[!is.na(test)])
## [1] 2.5
Run Code Online (Sandbox Code Playgroud)

或者,正如Richard Scriven补充道:

mean(na.omit(test))
Run Code Online (Sandbox Code Playgroud)

要么

mean(na.exclude(test))
Run Code Online (Sandbox Code Playgroud)