[R] efficiently picking one row from a data frame per unique key

Phil Spector spector at stat.berkeley.edu
Tue Apr 13 03:49:22 CEST 2010


James -
     If I understand you correctly:

getone = function(df)df[order(df$x,df$y),][1,]

describes what you want from each data frame corresponding
to a unique value of x.   Then, supposing that your data frame
is called df:

sdf = split(df,df$x)

will create a list of data frames for the unique values
of x, and

do.call(rbind,lapply(sdf,getone))

will return a data frame with one row for each unique value
of x.

 					- Phil Spector
 					 Statistical Computing Facility
 					 Department of Statistics
 					 UC Berkeley
 					 spector at stat.berkeley.edu


On Mon, 12 Apr 2010, James Kebinger wrote:

> Hello all, I'm trying to transform data frames by grouping the rows by the
> values in a particular column, ordered by another column, then picking the
> first row in each group.
>
> I'd like to convert a data frame like this:
>
> x  y  z
> 1 10 20
> 1 11 19
> 2 12 18
> 4 13 17
>
> into one with three rows, like this, where i've discarded one row:
>
> x  y  z
> 1 1 11 19
> 2 2 12 18
> 4 4 13 17
>
> I've got a solution using aggregate, but it gets very slow with any volume
> of data - the performance seems mostly IO bound and never finishes with  a
> data set ~6MB
>
> Here's how I'm currently trying to do this
>
> d = data.frame(x=c(1,1,2,4),y=c(10,11,12,13),z=c(20,19,18,17))
> d.ordered = d[order(-d$y),]
> aggregate(d.ordered,by=list(key=d.ordered$x),FUN=function(x){x[1]})
>
> I've tried to use split and unsplit, but unsplit complained about duplicate
> row names when reassembling the sub frames.
>
> thanks for your suggestions
>
> -james
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at 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.
>



More information about the R-help mailing list