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