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:pisican...@hotmail.com] > Sent: Thursday, February 12, 2009 4:35 PM > To: christos.hat...@nuverabio.com; R help project; > markle...@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.hat...@nuverabio.com > > To: pisican...@hotmail.com; r-help@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-boun...@r-project.org > >> [mailto:r-help-boun...@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@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. > >> > >> > > > > > _________________________________________________________________ > See how Windows connects the people, information, and fun > that are part of your life. > http://clk.atdmt.com/MRT/go/msnnkwxp1020093175mrt/direct/01/ > ______________________________________________ R-help@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.