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!
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
.
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
.