web-dev-qa-db-fra.com

Valeurs NA et fonction d'agrégation 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))

Lorsque 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, la première ligne entière 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

Ainsi, seule l'entrée (1,1) est ignorée.

Cela a causé un gros problème de débogage dans l'un de mes codes, car je pensais que ces deux appels étaient équivalents. Existe-t-il une bonne raison pour laquelle la méthode de saisie "formule" est traitée différemment?

Merci.

40
Ryan Walker

Bonne question, mais à mon avis, cela n’aurait pas dû causer un mal de tête dû au débogage majeur car il est documenté assez clairement à plusieurs endroits dans 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: fonction qui indique ce qui doit se passer lorsque les données contiennent des valeurs NA. La valeur par défaut consiste à ignorer les valeurs manquantes dans les variables données.


Je ne peux pas répondre pourquoi le mode de formule a été écrit différemment --- les auteurs de fonctions devront répondre --- les informations ci-dessus vous permettront probablement d'utiliser les éléments suivants:

aggregate(.~Name, M, FUN=sum, na.rm=TRUE, na.action=NULL)
#   Name Col1 Col2
# 1 name    1    2
47

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
jenesaisquoi