Hier is een eenvoudig dataframe met een ontbrekende waarde:
M = data.frame( Name = c('name', 'name'), Col1 = c(NA, 1) , Col2 = c(1, 1))
# Name Col1 Col2
# 1 name NA 1
# 2 name 1 1
Als ik aggregate
gebruik om variabelen te sum
per groep (‘Naam’) met behulp van de formula
-methode:
aggregate(. ~ Name, M, FUN = sum, na.rm = TRUE)
het resultaat is:
# RowName Col1 Col2
# name 1 1
Dus de hele eerste rij, die een NA
heeft, wordt genegeerd. Maar als u de “niet-formula
“-specificatie gebruikt:
aggregate(M[, 2:3], by = list(M$Name), FUN = sum, na.rm = TRUE)
het resultaat is:
# Group.1 Col1 Col2
# name 1 2
Hier wordt alleen de invoer (1,1) genegeerd.
Dit veroorzaakte grote hoofdpijn bij het debuggen van een van mijn codes, omdat ik dacht dat deze twee oproepen gelijkwaardig waren. Is er een goede reden waarom de invoermethode formula
anders wordt behandeld?
Bedankt.
Antwoord 1, autoriteit 100%
Goede vraag, maar naar mijn mening had dit geen grotehoofdpijn moeten veroorzaken bij het debuggen, omdat het vrij duidelijk is gedocumenteerd op meerdere plaatsen in de handleiding voor aggregate
.
Eerst, in het gebruiksgedeelte:
## S3 method for class 'formula'
aggregate(formula, data, FUN, ...,
subset, na.action = na.omit)
Later, in de beschrijving:
na.action
: een functie die aangeeft wat er moet gebeuren als de gegevens NA-waarden bevatten. De standaard is om ontbrekende waarden in de gegeven variabelen te negeren.
Ik kan niet antwoorden waaromde formulemodus anders is geschreven — dat is iets dat de functie-auteurs zouden moeten beantwoorden — maar met de bovenstaande informatie kun je waarschijnlijk het volgende gebruiken:
aggregate(.~Name, M, FUN=sum, na.rm=TRUE, na.action=NULL)
# Name Col1 Col2
# 1 name 1 2
Antwoord 2, autoriteit 31%
Als u wilt dat de formuleversie equivalent is, probeer dan dit:
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)