web-dev-qa-db-ja.com

Rでのna.rmとna.omitの違い

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 = TRUEna.omitはまったく同じことをしているはずではありませんか?欠損値を省略し、現在の値についてのみ平均を計算しますか?そして、その場合、両方の結果セットに同じ値を設定してはいけませんか?

ご意見ありがとうございます!

7
raluca

彼らは同じ結果を与えることになっていない。この例を考えてみましょう:

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を介して計算されます。 2番目のケースでは、2番目の行が削除されますその全体でbの値で、NAではないため、最初のケースで考慮されます)na.omitしたがって、b平均は(3+2)/2にすぎません。

15
nicola

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は、3つの列のいずれもNAでない場合に、結果データの列平均を取ります。

違いは、1つまたは2つの値がNAである行に由来します。

3
Miff