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

David Winsemius dwinsemius at comcast.net
Thu Jul 14 22:01:24 CEST 2011


Dmitri:

as.matrix makes a matrix out of the dataframe that is passed to it.

As a further note I attempted and failed for reasons that are unclear  
to me to construct a formula that would (I hoped) preserve the column  
names which are being mangle in the posted effort:

form <- as.formula(paste(
                      "cbind(",
                       paste( myvars, collapse=","),
                       ") ~ group+mydate",
                       sep=" ") )
 > myvars<-c("value1","value2")
 > example.agg1<-aggregate(formula=form,data=example, FUN=sum)
Error in m[[2L]][[2L]] : object of type 'symbol' is not subsettable
 > traceback()
2: aggregate.formula(formula = form, data = example, FUN = sum)
1: aggregate(formula = form, data = example, FUN = sum)

 > form
cbind(value1, value2) ~ group + mydate
 > parse(text=form)
expression(~
cbind(value1, value2), group + mydate)

So it seems to be correctly dispatched to aggregate.formula but not  
passing some check or another. Also tried with formula() rather than  
as.formula with identical error message. Also tried including without  
naming the argument.

-- 
David


On Jul 14, 2011, at 3:32 PM, Dimitri Liakhovitski wrote:

> Thank you, David, it does work.
> Could you please explain why? What exactly does changing it to "as  
> matrix" do?
> Thank you!
> Dimitri
>
> On Thu, Jul 14, 2011 at 3:25 PM, David Winsemius <dwinsemius at comcast.net 
> > wrote:
>>
>> 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
>>
>>
>
>
>
> -- 
> Dimitri Liakhovitski
> Ninah Consulting
> www.ninah.com

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list