Valeurs NA et fonction d'agrégat R
Voici un cadre de données simple avec une valeur manquante:
M = data.frame( Name = c('name','name'), Col1 = c(NA,1) , Col2 = c(1,1))
Quand j'applique l'agrégat à M de cette façon:
aggregate(.~Name, M, FUN=sum, na.rm=TRUE)
Le résultat est:
RowName Col1 Col2
name 1 1
Donc toute la première ligne est ignorée. Mais si je le fais
aggregate(M[,2:3], by=list(M$Name), FUN=sum, na.rm=TRUE)
Le résultat est
Group.1 Col1 Col2
name 1 2
Donc seule l'entrée (1,1) est ignorée.
Cela a causé un mal de tête de débogage majeur dans l'un de mes codes, puisque je pensais que ces deux appels étaient équivalents. Est-il une bonne raison pour laquelle la "formule" entrée la méthode est traitée différemment?
Merci.
2 réponses
Bonne question, mais à mon avis, cela n'aurait pas dû causer un mal de tête de débogage Majeur car il est documenté assez clairement à plusieurs endroits de la page de manuel pour aggregate
.
Tout d'abord, dans la section Utilisation:
## S3 method for class 'formula'
aggregate(formula, data, FUN, ...,
subset, na.action = na.omit)
Plus Tard, dans la description:
na.action
: une fonction qui indique ce qui devrait se produire lorsque les données contiennent des valeurs NA. La valeur par défaut est d'ignorer les valeurs manquantes dans les variables.
Je ne peux pas répondre Pourquoi le mode formule a été écrit différemment - - - c'est quelque chose que les auteurs de la fonction devraient répondre - - - mais en utilisant les informations ci-dessus, vous pouvez probablement utiliser ce qui suit:
aggregate(.~Name, M, FUN=sum, na.rm=TRUE, na.action=NULL)
# Name Col1 Col2
# 1 name 1 2
Si vous voulez que la version de la formule soit équivalente, essayez ceci:
M = data.frame( Name = rep('name',5), Col1 = c(NA,rep(1,4)) , Col2 = rep(1,5))
aggregate(. ~ Name, M, function(x) sum(x, na.rm=TRUE), na.action = na.pass)