2015-04-27 8 views
7

Warum aggregate() hier nicht funktioniert?Verwendung von aggregate() für data.frame-Objekte

> aggregate(cbind(var1 = 1:10, var2 = 101:110), 
     by=list(range=cut(1:10, breaks=c(2,4,8,10))), 
     FUN = function(x) 
     { 
     c(obs=length(x[, "var2"]), avg=mean(x[, "var2"]), sd=dev(x[, "var2"])) 
     }) 

Error in x[, "var2"] (from #1) : incorrect number of dimensions 

> cbind(var1 = 1:10, var2 = 101:110)[, "var2"] 
[1] 101 102 103 104 105 106 107 108 109 110 

UPDATE

Zurück Aggregat() Werte nach der korrekten Version ausgeführt wird:

> r = aggregate(data.frame(var1 = 1:10, var2 = 101:110), by=list(range=cut(1:10, breaks=c(2,4,8,10))), FUN = function(x) { c(obs=length(x), avg=mean(x), sd=sd(x)) }) 
> class(r) 
[1] "data.frame" 
> dim(r) 
[1] 3 3 
> r[,1] 
[1] (2,4] (4,8] (8,10] 
Levels: (2,4] (4,8] (8,10] 
> r[,2] 
    obs avg  sd 
[1,] 2 3.5 0.707107 
[2,] 4 6.5 1.290994 
[3,] 2 9.5 0.707107 
> r[,3] 
    obs avg  sd 
[1,] 2 103.5 0.707107 
[2,] 4 106.5 1.290994 
[3,] 2 109.5 0.707107 
> class(r[,2]) 
[1] "matrix" 
> class(r[,3]) 
[1] "matrix" 
+1

'cbind' mit numerischer Argumente gibt eine Matrix zurück, nicht einen Datenrahmen. Und Sie würden nicht erwarten, Spaltennamen innerhalb der an FUN übergebenen anonymen Funktion anzugeben. –

Antwort

3

Versorgung ein Datenrahmen und verstehen, dass die aggregierten Pässe nur Spaltenvektoren so x[ , "colname"] mit zum Scheitern verurteilt ist, weil „x“ kein Datenrahmen ist:

aggregate(data.frame(var1 = 1:10, var2 = 101:110), 
     by=list(range=cut(1:10, breaks=c(2,4,8,10))), 
     FUN = function(x) 
     { 
     c(obs=length(x), avg=mean(x), sd=sd(x)) 
     }) 
#------------ 
    range var1.obs var1.avg var1.sd var2.obs var2.avg  var2.sd 
1 (2,4] 2.0000000 3.5000000 0.7071068 2.0000000 103.5000000 0.7071068 
2 (4,8] 4.0000000 6.5000000 1.2909944 4.0000000 106.5000000 1.2909944 
3 (8,10] 2.0000000 9.5000000 0.7071068 2.0000000 109.5000000 0.7071068 
+0

Ist "x" eine Matrix? Ich würde nicht wissen, wie ich in diesen Teil des Codes eindringen könnte, um die Objekte zu inspizieren. –

+0

"x" wäre ein (möglicherweise benannt) numerischer (atomarer) Vektor an dem Punkt, an dem er/sie an 'FUN' übergeben wurde. Es hätte keine Dimension gehabt, also wäre es weder eine Matrix noch ein Datenrahmen. –

+0

Interessant, also wie erhalten wir eine Länge/Mittelwert/SD für jede Spalte im ursprünglichen data.frame-Objekt (var1/var2)? Wenn "x" ein einfacher Vektor ist, bedeutet das, dass FUN für jede data.frame-Spalte einmal aufgerufen wird? –

3

Das ist, weil aggregate nicht data.frames sein FUN= Argument nicht besteht. Es passiert den Vektor der Beobachtungen. Auch die [, "name"] Indizierung funktioniert nicht mit Matrizen. Stellen Sie sicher, dass Sie ein data.frame und nicht eine Matrix wie in Ihrem Beispiel übergeben. Vielleicht möchten Sie die by Funktion statt

by(data.frame(var1 = 1:10, var2 = 101:110), 
    list(range=cut(1:10, breaks=c(2,4,8,10))), 
    FUN = function(x) { c(obs=length(x[, "var2"]), avg=mean(x[, "var2"]), sd=sd(x[, "var2"])) }) 
+0

Ich habe den Aggregationscode überprüft, er konvertiert einen Matrixparameter in einen dat.frame, wenn es kein Zeitreihenobjekt ist. Welcher "Vektor der Beobachtungen" FUN nimmt genau? –

+0

Es geht in Spalten als Vektoren. Es funktioniert immer nur in einer Spalte. – MrFlick