> tmp
  row.labels        a b  c 
1          1 deadlift 7 13
2          2    squat 7 24
3          3    clean 7 10
4          4 deadlift 8  8
5          5    squat 8 20
6          6    clean 8  2
7          7 deadlift 9  5
8          8    squat 9 32
9          9    clean 9 19
> tapply(tmp$c,tmp$a,median)
 clean deadlift squat 
    10        8    24
> tmp[tapply(1:nrow(tmp),tmp$a,function(i,x) {x <- x[i]; i[x==median(x)]}, x=tmp$c),]
  row.labels        a b  c 
3          3    clean 7 10
4          4 deadlift 8  8
2          2    squat 7 24

If you have multiple grouping variables g1,g2,g3 you simply include those in the 2nd 
argument:

tmp[tapply(1:nrow(tmp),tmp[c("gp1","gp2","gp3")],function(i,x) {x <- x[i]; 
i[x==median(x)]}, x=tmp$c),]

Nick Ellis
CSIRO Marine Research   mailto:[EMAIL PROTECTED]
PO Box 120                      ph    +61 (07) 3826 7260
Cleveland QLD 4163      fax   +61 (07) 3826 7222
Australia                       http://www.marine.csiro.au
  
> 
> 
> ------------------------------
> 
> Message: 75
> Date: Wed, 31 Mar 2004 22:22:22 -0500
> From: Ed L Cashin <[EMAIL PROTECTED]>
> Subject: [R] row selection based on median in data frame
> To: [EMAIL PROTECTED]
> Message-ID: <[EMAIL PROTECTED]>
> Content-Type: text/plain; charset=us-ascii
> 
> Hi.  I am having trouble thinking of an easy way to grab rows out of a
> data frame.  I want to select the rows with a median value when the
> rows are similar.
> 
> A simple example is this table, which I could read into a data frame.
> I would like to find a new data frame with only the rows with a median
> value for the "c" column given a certain "a" value.
> 
> For example, the c values for deadlift rows are 13, 8, and 5, so the
> row with a c value of 8 should show up in the output.
> 
>         a          b          c
>      1        deadlift   7          13 
>      2        squat      7          24
>      3        clean      7          10
>      4        deadlift   8           8
>      5        squat      8          20
>      6        clean      8           2
>      7  deadlift   9           5
>      8  squat      9          32
>      9  clean      9          19
> 
> Result:
> 
>         a          b          c
>      4        deadlift   8           8
>      5        squat      8          20
>      3        clean      7          10
> 
> It's more complicated in my case, because I have not just one "a"
> column, but about eight columns that have to be the same.  I can do
> this with clumsy loops, but I wonder whether there's a better way.
> 
> -- 
> --Ed L Cashin            |   PGP public key:
>   [EMAIL PROTECTED]        |   http://noserose.net/e/pgp/
>

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to