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.

37
demandé sur Ryan Walker 2013-05-30 23:43:54

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
44
répondu A5C1D2H2I1M1N2O1R2T1 2013-05-30 19:55:48

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)
17
répondu jenesaisquoi 2013-05-30 20:02:19