[R] Vector indexing question

Paul Lynch plynchnlm at gmail.com
Fri Mar 30 06:07:58 CEST 2007


Adai-- Thanks a lot!  This is just what I was looking for.  I was
almost sure there had to be a neat of doing this.

Bert--  Thanks for the tip.

Marc-- Not quite, although your solution works fine for the case I
gave.  What I had in mind for a.id was an arbitrary sequence of the
numbers in the range [1,25], of length 75, though I was not savvy
enough with R to express that succinctly.  You spotted a shortcut that
I hadn't reallized I was introducing.

Thanks all for your help!
          --Paul

On 3/29/07, Adaikalavan Ramasamy <ramasamy at cancer.org.uk> wrote:
> Sounds like you have two different tables and are trying to mine one
> based on the other. Try
>
> ref <- data.frame( levels  = 1:25,
>                     ratings = rep(letters[1:5], times=5) )
>
> db <- data.frame( vals=101:175, levels=c(1:25, 1:25, 1:25) )
>
> levels.of.interest <- ref$levels[ ref$rating=="a" ]
> db$vals[ which(db$levels %in% levels.of.interest) ]
>
>   [1] 101 106 111 116 121 126 131 136 141 146 151 156 161 166 171
>
>
> OR a much more intuitive way is to merge both tables and proceeding as
>
> out <- merge( db, ref, by="levels", all.x=TRUE )
> out <- out[ order(out$val), ] # little cleanup
> subset( out, ratings=="a" )   # ignore the rownames
>
>     levels vals ratings
> 1       1  101       a
> 16      6  106       a
> 31     11  111       a
> 46     16  116       a
> 61     21  121       a
> 3       1  126       a
> 17      6  131       a
> 32     11  136       a
> 47     16  141       a
> 62     21  146       a
> 2       1  151       a
> 18      6  156       a
> 33     11  161       a
> 48     16  166       a
> 63     21  171       a
>
> Then you can do cool things using the apply() family like
>    tapply( out$vals, out$ratings, mean )
>      a   b   c   d   e
>    136 137 138 139 140
>
> Check out %in%, merge and apply.
>
> Regards, Adai
>
>
>
> Paul Lynch wrote:
> > Suppose you have 4 related vectors:
> >
> > a.id<-c(1:25, 1:25, 1:25)
> > a.vals <- c(101:175)        # same length as a.id (the values for those IDs)
> > a.id.levels <- c(1:25)
> > a.id.ratings <- rep(letters[1:5], times=5)    # same length as a.id.levels
> >
> > What I would like to do is specify a rating from a.ratings (e.g. "e"),
> > get the vector of corresponding IDs from a.id.levels (via
> > a.id.levels[a.id.ratings=='e']) and then somehow use those IDs in a.id
> > to get the corresponding values from a.vals.
> >
> > I think I can probably write a loop to construct of a vector of
> > ratings of the same length as a.id so that the ratings match the ID,
> > and then go from there.  Is there a better way?  Perhaps using factors
> > or levels or something?
> >
> > Thanks,
> >       --Paul
> >
>
>


-- 
Paul Lynch
Aquilent, Inc.
National Library of Medicine (Contractor)



More information about the R-help mailing list