2013-07-15 11 views
5

Kann ich aggregate() mit mehr Funktionen so verwenden, dass Aggregationen als separate Spalten und nicht als Teil einer Matrix gespeichert werden? Ich möchte Datenrahmen mit Spalten Group.1, cyl.1, cyl.2, nicht Group.1, cyl haben.Aggregat() mit mehr Funktionen -

# Only one function 
> aggdata <-aggregate(mtcars["cyl"], by=list(vs), FUN=mean, na.rm=TRUE) 
> aggdata 
    Group.1  cyl 
1  0 7.444444 
2  1 4.571429 
> str(aggdata) 
'data.frame': 2 obs. of 2 variables: 
$ Group.1: num 0 1 
$ cyl : num 7.44 4.57 
> 
# Two functions 
> aggdata <-aggregate(mtcars["cyl"], by=list(cyl), FUN=function(x) c(length(x),mean(x))) 
> aggdata 
    Group.1 cyl.1 cyl.2 
1  4 11  4 
2  6  7  6 
3  8 14  8 
> str(aggdata) 
'data.frame': 3 obs. of 2 variables: 
$ Group.1: num 4 6 8 
$ cyl : num [1:3, 1:2] 11 7 14 4 6 8 
> aggdata$cyl 
    [,1] [,2] 
[1,] 11 4 
[2,] 7 6 
[3,] 14 8 

Antwort

8

Wickeln Sie es in do.call(data.frame, ...):

aggdata <-aggregate(mtcars["cyl"], by=list(mtcars$cyl), 
        FUN=function(x) c(length(x),mean(x))) 
do.call(data.frame, aggdata) 
# Group.1 cyl.1 cyl.2 
# 1  4 11  4 
# 2  6  7  6 
# 3  8 14  8 
str(do.call(data.frame, aggdata)) 
# 'data.frame': 3 obs. of 3 variables: 
# $ Group.1: num 4 6 8 
# $ cyl.1 : num 11 7 14 
# $ cyl.2 : num 4 6 8 

Nach ein bisschen suchen, fand ich gerade the source of my answer. Es gibt ein paar andere Fragen, die ähnlich sind, aber hier lernte ich den do.call(data.frame, ...) Ansatz.

(in den Sinn kam, was zu suchen nach @James die gleiche Antwort hinzugefügt, wie ich seine tat und gelöscht ....)

6

Hier ist eine andere Idee - Schalter auf data.table statt:

library(data.table) 
dt = data.table(mtcars) 

dt[, list(.N, mean(cyl)), by = cyl] 
# cyl N V2 
#1: 6 7 6 
#2: 4 11 4 
#3: 8 14 8 
# note, data.table is smart enough not to copy cyl needlessly 
# when you're grouping by it, so if you attempt to get length(cyl), you'll get 1 
# since cyl is just a number in each 'by' group 

str(dt[, list(.N, mean(cyl)), by = cyl]) 
#Classes ‘data.table’ and 'data.frame': 3 obs. of 3 variables: 
# $ cyl: num 6 4 8 
# $ N : int 7 11 14 
# $ V2 : num 6 4 8 
# - attr(*, ".internal.selfref")=<externalptr> 
+0

+1. Ich dachte darüber nach, diese Option zu teilen, weil ich ihre Syntax viel besser finde, aber sie geht nicht auf die eigentliche Frage ein, was mit der Ausgabe von "aggregate" zu tun ist, die ich schon einmal gesehen habe und die etwas unpraktisch ist . – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Ich stimme zu, dass es die Frage nicht beantwortet (und soweit die Frage geht Ihr ist die Antwort darauf), aber ich denke im Grunde OP war die falsche Frage :) – eddi

+1

Ich habe gerade [die Quelle meiner gefunden Antwort] (http://stackoverflow.com/a/14759569/1270695). Es gibt ein paar andere ähnliche Fragen, aber hier habe ich den 'do.call (data.frame, ...)' Ansatz gelernt. – A5C1D2H2I1M1N2O1R2T1