> -----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.

Reply via email to