[R] Aggregate: assembling the "by" part on the fly

Andrew C. Ward andreww at cheque.uq.edu.au
Wed Jul 24 14:46:21 CEST 2002


Thank you, Petr.

Your example
	> aggregate(dat[,1],list(daf$Age,daf$Year),length)
is exactly what I want, but without hard-coding the
bits in list(...).

In my case, aggregate is inside another function to
which I pass a dataframe. The names of the columns
will vary from call to call, as may the number of
columns.

Thanks again.

Regards,

Andrew C. Ward

CAPE Centre
Department of Chemical Engineering
The University of Queensland
Brisbane Qld 4072 Australia
andreww at cheque.uq.edu.au



On Tuesday, July 23, 2002 7:11 PM, Petr Pikal [SMTP:petr.pikal at precheza.cz] wrote:
> 
> 
> On 23 Jul 2002 at 17:11, Andrew C. Ward wrote:
> 
> > Dear R users,
> > 
> > I'm having trouble using aggregate() and would
> > greatly appreciate your advice. I am using R 1.5.1
> > on Windows 2000.
> > 
> > I want to call my function in the following way
> >  extract.data(x=dat[, "Age", "Year"])
> > where extract.data() uses aggregate() to count the number
> > of cases for each combination of "Age" and "Year".
> > 
> > I've defined extract.data() in the following way
> >  extract.data <- function(x) {
> >   tmp <- aggregate(x[,1], by=list(dimnames(x)[[2]]), length)
> >   dimnames(tmp)[[2]] <- c(dimnames(x)[[2]], "N")
> >   invisible(tmp)
> >  }
> > The call to aggregate obviously won't work (and doesn't).
> 
> Well, I think you are not doing what you exactly want (and what aggregate 
> requires).
> 
> if your data frame looks for instance:
> 
> > daf
>    ID Age Year
> 1   1   5 1995
> 2   2   6 1995
> 3   3   8 1995
> 4   4   5 1995
> 5   5   6 1996
> 6   6   7 1996
> 7   7   5 1996
> 8   8   6 1996
> 9   9   7 1996
> 10 10   5 1996
> 
> aggregate will do what you want smoothly
> 
> > aggregate(daf[,1],list(daf$Age,daf$Year),length)
>   Group.1 Group.2 x
> 1       5    1995 2
> 2       6    1995 1
> 3       8    1995 1
> 4       5    1996 2
> 5       6    1996 2
> 6       7    1996 2
> 
> look at the difference in output
> 
> > list(daf$Age,daf$Year)
> [[1]]
>  [1] 5 6 8 5 6 7 5 6 7 5
> 
> [[2]]
>  [1] 1995 1995 1995 1995 1996 1996 1996 1996 1996 1996
> 
> > list(dimnames(daf)[[2]])
> [[1]]
> [1] "ID"   "Age"  "Year"
> 
> 
> 
> > 
> > I'm wondering how to assemble the "by" argument inside
> > extract.data() when I wish aggregate() to use all the
> > columns in my data frame.
> 
> Using all columns seems to me a liitle bit surprising. Do you mean to use also a 
> column on which the aggregation is performed?
> 
> > 
> > Thank you very much for your help.
> > 
> > 
> > Regards,
> > 
> > Andrew C. Ward
> > 
> > CAPE Centre
> > Department of Chemical Engineering
> > The University of Queensland
> > Brisbane Qld 4072 Australia
> > andreww at cheque.uq.edu.au
> 
> 
> Best regardsPetr Pikal
> petr.pikal at precheza.cz
> p.pik at volny.cz
> 
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list