R中na.rm和na.omit的区别
The difference of na.rm and na.omit in R
我刚刚开始使用 R 并执行了这些语句:
library(datasets)
head(airquality)
s <- split(airquality,airquality$Month)
sapply(s, function(x) {colMeans(x[,c("Ozone", "Solar.R", "Wind")], na.rm = TRUE)})
lapply(s, function(x) {colMeans(na.omit(x[,c("Ozone", "Solar.R", "Wind")])) })
对于sapply
,它returns如下:
5 6 7 8 9
Ozone 23.61538 29.44444 59.115385 59.961538 31.44828
Solar.R 181.29630 190.16667 216.483871 171.857143 167.43333
Wind 11.62258 10.26667 8.941935 8.793548 10.18000
对于 lapply
,returns 如下:
$`5`
Ozone Solar.R Wind
24.12500 182.04167 11.50417
$`6`
Ozone Solar.R Wind
29.44444 184.22222 12.17778
$`7`
Ozone Solar.R Wind
59.115385 216.423077 8.523077
$`8`
Ozone Solar.R Wind
60.00000 173.08696 8.86087
$`9`
Ozone Solar.R Wind
31.44828 168.20690 10.07586
现在,我的问题是,为什么返回值相似,但不相同? na.rm = TRUE
和 na.omit
不应该做完全相同的事情吗?忽略缺失值并仅计算我们拥有的值的平均值?在那种情况下,我不应该在两个结果集中使用相同的值吗?
非常感谢您的任何意见!
sapply(s, function(x) {colMeans(x[,c("Ozone", "Solar.R", "Wind")], na.rm = TRUE)})
单独处理每一列,并计算每一列中非 NA 值的平均值。
lapply(s, function(x) {colMeans(na.omit(x[,c("Ozone", "Solar.R", "Wind")])) })
子集 s
到三列中 none 为 NA
的情况,然后对结果数据采用列均值。
不同之处在于那些具有一个或两个值的行 NA
。
他们不应该给出相同的结果。考虑这个例子:
exdf<-data.frame(a=c(1,NA,5),b=c(3,2,2))
# a b
#1 1 3
#2 NA 2
#3 5 2
colMeans(exdf,na.rm=TRUE)
# a b
#3.000000 2.333333
colMeans(na.omit(exdf))
# a b
#3.0 2.5
这是为什么?第一种情况,b
列的均值是通过(3+2+2)/3
计算出来的。在第二种情况下,第二行被 完全删除 (也是 b
的值,它不是 NA,因此在第一种情况下被考虑) na.omit
所以 b
的意思就是 (3+2)/2
.
我刚刚开始使用 R 并执行了这些语句:
library(datasets)
head(airquality)
s <- split(airquality,airquality$Month)
sapply(s, function(x) {colMeans(x[,c("Ozone", "Solar.R", "Wind")], na.rm = TRUE)})
lapply(s, function(x) {colMeans(na.omit(x[,c("Ozone", "Solar.R", "Wind")])) })
对于sapply
,它returns如下:
5 6 7 8 9
Ozone 23.61538 29.44444 59.115385 59.961538 31.44828
Solar.R 181.29630 190.16667 216.483871 171.857143 167.43333
Wind 11.62258 10.26667 8.941935 8.793548 10.18000
对于 lapply
,returns 如下:
$`5`
Ozone Solar.R Wind
24.12500 182.04167 11.50417
$`6`
Ozone Solar.R Wind
29.44444 184.22222 12.17778
$`7`
Ozone Solar.R Wind
59.115385 216.423077 8.523077
$`8`
Ozone Solar.R Wind
60.00000 173.08696 8.86087
$`9`
Ozone Solar.R Wind
31.44828 168.20690 10.07586
现在,我的问题是,为什么返回值相似,但不相同? na.rm = TRUE
和 na.omit
不应该做完全相同的事情吗?忽略缺失值并仅计算我们拥有的值的平均值?在那种情况下,我不应该在两个结果集中使用相同的值吗?
非常感谢您的任何意见!
sapply(s, function(x) {colMeans(x[,c("Ozone", "Solar.R", "Wind")], na.rm = TRUE)})
单独处理每一列,并计算每一列中非 NA 值的平均值。
lapply(s, function(x) {colMeans(na.omit(x[,c("Ozone", "Solar.R", "Wind")])) })
子集 s
到三列中 none 为 NA
的情况,然后对结果数据采用列均值。
不同之处在于那些具有一个或两个值的行 NA
。
他们不应该给出相同的结果。考虑这个例子:
exdf<-data.frame(a=c(1,NA,5),b=c(3,2,2))
# a b
#1 1 3
#2 NA 2
#3 5 2
colMeans(exdf,na.rm=TRUE)
# a b
#3.000000 2.333333
colMeans(na.omit(exdf))
# a b
#3.0 2.5
这是为什么?第一种情况,b
列的均值是通过(3+2+2)/3
计算出来的。在第二种情况下,第二行被 完全删除 (也是 b
的值,它不是 NA,因此在第一种情况下被考虑) na.omit
所以 b
的意思就是 (3+2)/2
.