Dimitri Liakhovitski
2011-Jul-14 19:05 UTC
[R] cbind in aggregate formula - based on an existing object (vector)
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
David Winsemius
2011-Jul-14 19:25 UTC
[R] cbind in aggregate formula - based on an existing object (vector)
On Jul 14, 2011, at 3:05 PM, Dimitri Liakhovitski 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! >Not sure I have gotten all the way there, but this does work: example.agg1<-aggregate(as.matrix(example[myvars])~group +mydate,sum,data=example) > example.agg1 group mydate example[myvars] NA 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> 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.David Winsemius, MD West Hartford, CT
Dennis Murphy
2011-Jul-14 22:10 UTC
[R] cbind in aggregate formula - based on an existing object (vector)
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. >
Reasonably Related Threads
- using "aggregate" when variable names contain spaces
- merging 2 frames while keeping all the entries from the "reference" frame
- transform.data.frame() ignores unnamed arguments when no named argument is provided
- How to arrange the data
- How to read XML in UTF-8 format?