it-swarm.com.de

NA-Werte und R-Aggregatfunktion

Hier ist ein einfacher Datenrahmen mit einem fehlenden Wert:

M = data.frame( Name = c('name','name'), Col1 = c(NA,1) , Col2 = c(1,1))

Wenn ich Aggregat auf M so anwende:

aggregate(.~Name, M, FUN=sum, na.rm=TRUE)

das Ergebnis ist:

RowName Col1 Col2
name    1    1

Die gesamte erste Zeile wird also ignoriert. Aber wenn ich es mache

aggregate(M[,2:3], by=list(M$Name), FUN=sum, na.rm=TRUE)

das Ergebnis ist

Group.1 Col1 Col2
name    1    2

Daher wird nur der Eintrag (1,1) ignoriert.

Dies verursachte in einem meiner Codes große Kopfschmerzen beim Debuggen, da ich diese beiden Aufrufe für gleichwertig hielt. Gibt es einen guten Grund, warum die Eingabemethode "Formel" anders behandelt wird?

Vielen Dank.

40
Ryan Walker

Gute Frage, aber meiner Meinung nach hätte dies nicht zu major Kopfschmerzen beim Debuggen führen sollen, da dies an mehreren Stellen in der Handbuchseite für aggregate ziemlich klar dokumentiert ist.

Zunächst im Abschnitt zur Verwendung:

## S3 method for class 'formula'
aggregate(formula, data, FUN, ...,
          subset, na.action = na.omit)

Später in der Beschreibung:

na.action: Eine Funktion, die angibt, was passieren soll, wenn die Daten NA-Werte enthalten. Standardmäßig werden fehlende Werte in den angegebenen Variablen ignoriert.


Ich kann nicht antworten warum der Formelmodus wurde anders geschrieben --- das ist etwas, was die Funktionsautoren beantworten müssten --- aber wenn Sie die obigen Informationen verwenden, können Sie wahrscheinlich Folgendes verwenden:

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

Wenn Sie möchten, dass die Formelversion gleichwertig ist, versuchen Sie Folgendes:

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