[R] Aggregrate function

Christos Hatzis christos.hatzis at nuverabio.com
Thu Feb 12 22:45:25 CET 2009

```This requires a small modification to use which instead of which.max that
returns only the first maximum:

do.call("rbind", lapply(split(xveg, xveg\$loc), function(x) x[which(x\$tot ==
max(x\$tot)), ]))

loc sp tot
L1    L1  b  60
L2.5  L2  d  25
L2.7  L2  e  25
L3    L3  b  68

-Christos

> -----Original Message-----
> From: Monica Pisica [mailto:pisicandru at hotmail.com]
> Sent: Thursday, February 12, 2009 4:35 PM
> To: christos.hatzis at nuverabio.com; R help project;
> markleeds at verizon.net
> Subject: RE: [R] Aggregrate function
>
>
> Hi,
>
> Thanks for the solution. Mark Leeds sent me privately a very
> similar solution. My next question to him was:
>
> Suppose that for a certain location 2 species have the same
> maximum total ... (there are ties in the data for a
> particular location). How do i get all species that have that
> max. total??
>
> For this case i have changed the tot as follows:
>
> tot <-  c(20, 60, 40, 15, 25, 15, 25, 20, 68, 32)
>
> His sollution is (and does work):
>
> temp <- lapply(split(xveg,loc), function(.df) {
>   maxindices <- which(.df\$tot == .df\$tot[which.max(.df\$tot)])
>
> data.frame(loc=.df\$loc[1],sp=paste(.df\$sp[maxindices],collapse
> =","),tot=max(.df\$tot))
> })
>
> result <- do.call(rbind,temp)
> print(result)
>
> Thanks so much again,
>
> Monica
>
>
>
> > From: christos.hatzis at nuverabio.com
> > To: pisicandru at hotmail.com; r-help at r-project.org
> > Subject: RE: [R] Aggregrate function
> > Date: Thu, 12 Feb 2009 15:56:38 -0500
> >
> > I don't have an easy solution with aggregate, because the
> function in
> > aggregate needs to return a scalar.
> > But the following should work:
> >
> > do.call("rbind", lapply(split(xveg, xveg\$loc), function(x)
> > x[which.max(x\$tot), ]))
> >
> > loc sp tot
> > L1 L1 b 60
> > L2 L2 e 30
> > L3 L3 b 68
> >
> > -Christos
> >
> >> -----Original Message-----
> >> From: r-help-bounces at r-project.org
> >> [mailto:r-help-bounces at r-project.org] On Behalf Of Monica Pisica
> >> Sent: Thursday, February 12, 2009 1:58 PM
> >> To: R help project
> >> Subject: [R] Aggregrate function
> >>
> >>
> >> Hi,
> >>
> >> I have to recognize that i don't fully understand the aggregate
> >> function, but i think it should help me with what i want to do.
> >>
> >> xveg is a data.frame with location, species, and total for the
> >> species. Each location is repeated, once for every species
> present at
> >> that location. For each location i want to find out which
> species has
> >> the maximum total ... so i've tried different ways to do it using
> >> aggregate.
> >>
> >> loc <- c(rep("L1", 3), rep("L2", 5), rep("L3", 2)) sp <-
> c("a", "b",
> >> "c", "a", "d", "b", "e", "c", "b", "d") tot <- c(20, 60,
> 40, 15, 25,
> >> 10, 30, 20, 68, 32) xveg <- data.frame(loc, sp, tot)
> >>
> >> result desired:
> >>
> >> L1 b
> >> L2 e
> >> L3 b
> >>
> >> sp_maj <- aggregate(xveg[,2], list(xveg[,1], function(x)
> >> levels(x)[which.max(table(x))])
> >>
> >> This is wrong because it gives the first species name in
> each level
> >> of location, so i get a, a, b, as species instead of b, e, b.
> >>
> >> I've tried other few aggregate commands, all with wrong results.
> >>
> >> I will appreciate any help,
> >>
> >> Thanks,
> >>
> >> Monica
> >>
> >> _________________________________________________________________
> >>
> >> the go.
> >>
> >> ______________________________________________
> >> R-help at r-project.org mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-help
> >> http://www.R-project.org/posting-guide.html
> >> and provide commented, minimal, self-contained, reproducible code.
> >>
> >>
> >
> >
> _________________________________________________________________
> See how Windows connects the people, information, and fun
> that are part of your life.
> http://clk.atdmt.com/MRT/go/msnnkwxp1020093175mrt/direct/01/
>

```