[R] Vector indexing question

Adaikalavan Ramasamy ramasamy at cancer.org.uk
Fri Mar 30 02:39:51 CEST 2007


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
>



More information about the R-help mailing list