[R] Select top three values from data frame

Don MacQueen macq at llnl.gov
Wed Aug 26 17:23:26 CEST 2009

Do you want just the values (i.e., a vector), or do you also want the 
corresponding rows of the data frame?

What if there is a tie, or do you know in advance that within any 
particular subset the values of B are unique?

What if the subset that meets the constraints has fewer than 3 unique 
values? (which I think is the case in your example)

    tail(  unique( sort( df$B[  df$A=='x' & df$C < 2 ] ) ) ,3 )

Should do it (but I haven't tested).

Why does it get messy with over 100 columns?
I'll pretend for the moment that you have exactly 100 columns:
    1)  you will be doing this many times, each time with a different 
sets of 3 columns?
    2)  you want the three highest values in each of 98 columns based 
on constraints on the other two?
    3)  you want the three highest values of B based on constraints on 
all of the other 99 columns?

Depending on what changes when more columns are involved, you might 
be able to loop over columns with syntax like,

    for (nm in c('B','D','E') )   tail(  unique( sort( df[[nm]][ 
df$A=='x' & df$C < 2 ] ) ) ,3 )


At 1:36 AM -0700 8/26/09, Noah Silverman wrote:
>I'm trying to find an easy way to do this.
>I want to select the top three values of a specific column in a 
>subset of rows in a data.frame.  I'll demonstrate.
>A    B    C
>x    2    1
>x    4    1
>x    3    2
>y    1    5
>y    2    6
>y    3    8
>I want the top 3 values of B from the data.frame where A=X and C <2
>I could extract all the rows where C<2, then sort by B, then take 
>the first 3.  But that seems like the wrong way around, and it also 
>will get messy with real data of over 100 columns.
>Any suggestions?
>R-help at r-project.org mailing list
>PLEASE do read the posting guide http://*www.*R-project.org/posting-guide.html
>and provide commented, minimal, self-contained, reproducible code.

Don MacQueen
Environmental Protection Department
Lawrence Livermore National Laboratory
Livermore, CA, USA

More information about the R-help mailing list