2013-07-15 15 views
5

Czy mogę używać funkcji aggregate() z większą liczbą funkcji w taki sposób, że agregacje są przechowywane jako oddzielne kolumny, a nie jako część macierzy? Chcę mieć ramkę danych z kolumnami Group.1, cyl.1, cyl.2, a nie Group.1, cyl.Aggregate() z większą liczbą funkcji -

# 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 

Odpowiedz

8

owinąć go w 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 

Po wyszukaniu trochę, ja po prostu znaleźć the source of my answer. Jest jeszcze kilka innych pytań podobnych do tego, ale właśnie tam nauczyłem się podejścia do.call(data.frame, ...).

(przyszło mi do głowy co szukać po @James dodaje taką samą odpowiedź jak ja i usunięte His ....)

6

Oto inny pomysł - przełącznik do data.table zamiast:

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. Pomyślałem o udostępnieniu tej opcji, ponieważ podoba mi się jej składnia o wiele lepiej, ale nie odnosi się ona do faktycznego pytania o to, co zrobić z wyjściem "agregatu", z którym wcześniej się spotkałem i jest nieco niezręczne w obsłudze . – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Zgadzam się, że to nie odpowiada na pytanie (a jeśli chodzi o pytanie, to twoja jest odpowiedzią na to pytanie), ale zasadniczo myślę, że OP zadawał niewłaściwe pytanie :) – eddi

+1

Właśnie znalazłem [źródło mojego odpowiedź] (http://stackoverflow.com/a/14759569/1270695). Jest kilka innych pytań podobnych do tego, ale to właśnie tam nauczyłem się podejścia 'do.call (data.frame, ...)'. – A5C1D2H2I1M1N2O1R2T1

Powiązane problemy