2015-11-18 15 views
5

ich folgende data.frame als Beispiel:Aggregate mit na.action = na.pass gibt unerwartete Antwort

d <- data.frame(x=c(1,NA), y=c(2,3)) 

Ich mag würde die Werte von y durch die Variable x zusammenzufassen. Da es keinen gemeinsamen Wert von x gibt, würde ich erwarten, dass die Aggregation mir nur die ursprüngliche data.frame zurückgibt, wo NA als Gruppe behandelt wird. Aber Aggregation gibt mir die folgenden Ergebnisse.

>aggregate(y ~ x, data=d, FUN=sum) 
    x y 
1 1 2 

Ich habe die Dokumentation über das Ändern der Standardaktionen von na.action lesen, aber es scheint nicht zu mir sinnvoll, etwas zu geben.

>aggregate(y ~ x, data=d, FUN=sum, na.action=na.pass) 
    x y 
1 1 2 

Was ist los? Ich verstehe nicht, was na.pass in diesem Fall macht. Gibt es eine Option, um zu erreichen, was ich in R will? Jede Hilfe würde sehr geschätzt werden.

+2

Sie sagen, dass Sie einen 'NA' Wert als eine Gruppierungsvariable betrachten? Willst du die "NA" oder nicht? (Es ist nicht klar, weil Sie auch 'na.rm = TRUE' als Teil Ihres Tests verwenden .... – A5C1D2H2I1M1N2O1R2T1

+0

Ja, ich möchte NA als Gruppe. – Sanias

+0

Die Dokumentation sagt" Zeilen mit fehlenden Werten in einem der Variablen werden aus dem Ergebnis weggelassen. "Wenn Sie das nicht möchten, müssen Sie Ihre' by' -Variable neu codieren oder eine andere Funktion für die Aggregation verwenden. – Roland

Antwort

7

aggregate verwendet tapply, was wiederum factor für seine Gruppierungsvariable verwendet.

Aber schauen, was in factor mit NA Werte geschieht:

factor(c(1, 2, NA)) 
# [1] 1 2 <NA> 
# Levels: 1 2 

Notiere die levels. Sie können von addNA halten die NA machen:

addNA(factor(c(1, 2, NA))) 
# [1] 1 2 <NA> 
# Levels: 1 2 <NA> 

So würden Sie wahrscheinlich benötigen, wie etwas zu tun:

aggregate(y ~ addNA(x), d, sum) 
# addNA(x) y 
# 1  1 2 
# 2  <NA> 3 

Oder so etwas wie:

d$x <- addNA(factor(d$x)) 
str(d) 
# 'data.frame': 2 obs. of 2 variables: 
# $ x: Factor w/ 2 levels "1",NA: 1 2 
# $ y: num 2 3 
aggregate(y ~ x, d, sum) 
#  x y 
# 1 1 2 
# 2 <NA> 3 

(Alternativ können Sie das Upgrade auf "data.table" umstellen, was nicht nur schneller ist n aggregate, die Ihnen aber auch ein konsistenteres Verhalten mit NA Werten geben wird. Keine Notwendigkeit zu beachten, ob Sie using the formula method of aggregate or not sind.)

library(data.table) 
as.data.table(d)[, sum(y), by = x] 
#  x V1 
# 1: 1 2 
# 2: NA 3 
+0

Danke, ich schätze das. Ich bin neugierig auf die Funktionalität von na. Die Dokumentation besagt, dass sie "das Objekt unverändert zurückgibt". Warum werden die NAs scheinbar entfernt? – Sanias

+0

@Sanias, das heißt in Bezug auf die aggregierten Spalten, nicht die "by" -Spalten. – A5C1D2H2I1M1N2O1R2T1

Verwandte Themen