> -----Original Message----- > From: r-help-boun...@r-project.org > [mailto:r-help-boun...@r-project.org] On Behalf Of hadley wickham > Sent: Friday, October 02, 2009 6:07 AM > To: jim holtman > Cc: r-help@r-project.org; Kavitha Venkatesan > Subject: Re: [R] split-apply question > > On Fri, Oct 2, 2009 at 4:24 AM, jim holtman > <jholt...@gmail.com> wrote: > > try this: > > > >> x <- read.table(textConnection("x1 x2 x3 > > + A 1 1.5 > > + B 2 0.9 > > + B 3 2.7 > > + C 7 1.8 > > + D 7 1.3"), header=TRUE) > >> closeAllConnections() > >> do.call(rbind, lapply(split(seq(nrow(x)), x$x1), function(.row){ > > + x[.row[which.min(x$x2[.row])],] > > + })) > > x1 x2 x3 > > A A 1 1.5 > > B B 2 0.9 > > C C 7 1.8 > > D D 7 1.3 > >> > > Or, using plyr and subset > > library(plyr) > ddply(x, "x1", subset, x2 == min(x2)) > > Hadley
Since we are using min() we can use sorting tricks f3 <- function(x) { x <- x[with(x, order(x1,x2)),] isFirstInRun <- function(z)c(TRUE, z[-1] != z[-length(z)]) x[isFirstInRun(x$x1),] } This has the advantage that it keeps the original row names intact. It is quick even when there are lots of unique values in x1. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > -- > http://had.co.nz/ > > ______________________________________________ > 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. > ______________________________________________ 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.