Vector indexing question
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)