web-dev-qa-db-fra.com

La différence de na.rm et na.omit dans R

Je viens de commencer avec R et j'ai exécuté ces instructions:

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")])) }) 

Pour le sapply, il renvoie ce qui suit:

             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

Et pour lapply, il renvoie ce qui suit:

$`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 

Maintenant, ma question serait, pourquoi les valeurs retournées sont-elles similaires, mais pas les mêmes? N'est-ce pas na.rm = TRUE et na.omit censé faire exactement la même chose? Omettre les valeurs manquantes et calculer la moyenne uniquement pour les valeurs que nous avons? Et dans ce cas, ne devrais-je pas avoir les mêmes valeurs dans les deux jeux de résultats?

Merci beaucoup pour toute contribution!

7
raluca

Ils ne sont pas censés donner le même résultat. Considérez cet exemple:

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

Pourquoi est-ce? Dans le premier cas, la moyenne de la colonne b est calculée par (3+2+2)/3. Dans le deuxième cas, la deuxième ligne est supprimée dans son intégralité (également la valeur de b qui n'est pas-NA et donc considérée dans le premier cas) par na.omit et donc la moyenne de b est juste (3+2)/2.

15
nicola

sapply(s, function(x) {colMeans(x[,c("Ozone", "Solar.R", "Wind")], na.rm = TRUE)}) traite chaque colonne individuellement et calcule la moyenne des valeurs non NA dans chaque colonne.

lapply(s, function(x) {colMeans(na.omit(x[,c("Ozone", "Solar.R", "Wind")])) }) sous-ensembles sà ces cas où aucune des trois colonnes n'est NA, puis prend la moyenne des colonnes pour les données résultantes.

La différence vient des lignes qui ont une ou deux des valeurs comme NA.

3
Miff