aggregatiemethoden behandelen ontbrekende waarden (NA) anders

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 aggregategebruik om variabelen te sumper 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 NAheeft, 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 formulaanders 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)

Other episodes