我刚开始使用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
,它返回以下内容:
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
,它返回以下内容:
$`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
应该做同样的事情?省略缺失值并仅计算我们所拥有的值的平均值?在这种情况下,我不应该在两个结果集中都有相同的值吗?
非常感谢你的任何输入!
它们不应该给出相同的结果.考虑这个例子:
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
.