Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Aggregate() with more functions -

Tags:

r

aggregate

Can I use aggregate() with more functions in such way that aggregations are stored as separate columns and not as part of a matrix? I want to have data frame with columns Group.1, cyl.1, cyl.2, not Group.1, cyl.

# 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
like image 995
Tomas Greif Avatar asked Jul 15 '13 17:07

Tomas Greif


1 Answers

Wrap it 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

After searching a little bit, I just found the source of my answer. There are a few other questions similar to this, but this was where I learned the do.call(data.frame, ...) approach.

(Came to mind what to search for after @James added the same answer as I did and deleted his....)

like image 118
A5C1D2H2I1M1N2O1R2T1 Avatar answered Nov 02 '22 23:11

A5C1D2H2I1M1N2O1R2T1