[R] cbind in aggregate formula - based on an existing object (vector)

Dennis Murphy djmuser at gmail.com
Fri Jul 15 00:10:15 CEST 2011


Hi:

I think Bill's got the right idea for your problem, but for the fun of
it, here's how Bert's suggestion would play out:

# Kind of works, but only for the first variable in myvars...
> aggregate(get(myvars) ~ group + mydate, FUN = sum, data = example)
   group     mydate get(myvars)
1 group1 2008-12-01           4
2 group2 2008-12-01           6
3 group1 2009-01-01          40
4 group2 2009-01-01          60
5 group1 2009-02-01         400
6 group2 2009-02-01         600

# Maybe sapply() with get as the function will work...
> aggregate(sapply(myvars, get) ~ group + mydate, FUN = sum, data = example)
   group     mydate myvars   get
1 group1 2008-12-01      4   4.2
2 group2 2008-12-01      6   6.2
3 group1 2009-01-01     40  40.2
4 group2 2009-01-01     60  60.2
5 group1 2009-02-01    400 400.2
6 group2 2009-02-01    600 600.2

Apart from the variable names, it matches example.agg1. OTOH, Bill's
suggestion matches example.agg1 exactly and has an advantage in terms
of code clarity:

byVars <- c('group', 'mydate')
> aggregate(example[myvars], by = example[byVars], FUN = sum)
   group     mydate value1 value2
1 group1 2008-12-01      4    4.2
2 group2 2008-12-01      6    6.2
3 group1 2009-01-01     40   40.2
4 group2 2009-01-01     60   60.2
5 group1 2009-02-01    400  400.2
6 group2 2009-02-01    600  600.2

FWIW,
Dennis

On Thu, Jul 14, 2011 at 12:05 PM, Dimitri Liakhovitski
<dimitri.liakhovitski at gmail.com> wrote:
> Hello!
>
> I am aggregating using a formula in aggregate - of the type:
> aggregate(cbind(var1,var2,var3)~factor1+factor2,sum,data=mydata)
>
> However, I actually have an object (vector of my variables to be aggregated):
> myvars<-c("var1","var2","var3")
>
> I'd like my aggregate formula (its "cbind" part) to be able to use my
> "myvars" object. Is it possible?
> Thanks for your help!
>
> Dimitri
>
> Reproducible example:
>
> mydate = rep(seq(as.Date("2008-12-01"), length = 3, by = "month"),4)
> value1=c(1,10,100,2,20,200,3,30,300,4,40,400)
> value2=c(1.1,10.1,100.1,2.1,20.1,200.1,3.1,30.1,300.1,4.1,40.1,400.1)
>
> example<-data.frame(mydate=mydate,value1=value1,value2=value2)
> example$group<-c(rep("group1",3),rep("group2",3),rep("group1",3),rep("group2",3))
> example$group<-as.factor(example$group)
> (example);str(example)
>
> example.agg1<-aggregate(cbind(value1,value2)~group+mydate,sum,data=example)
> # this works
> (example.agg1)
>
> ### Building my object (vector of 2 names - in reality, many more):
> myvars<-c("value1","value2")
> example.agg1<-aggregate(cbind(myvars)~group+mydate,sum,data=example)
> ### does not work
>
>
> --
> Dimitri Liakhovitski
> Ninah Consulting
> www.ninah.com
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list