[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