Thanks to everyone for the different suggestions! Very useful.

PS: The "aggregate" function based solution didnt work as-is for me, perhaps
it needs some modification?

Thanks again,


On Fri, Oct 2, 2009 at 1:51 PM, William Dunlap <wdunlap@tibco.com> wrote:

>
> > -----Original Message-----
> > From: r-help-bounces@r-project.org
> > [mailto:r-help-bounces@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
> > <jholtman@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.
> >
>

	[[alternative HTML version deleted]]


