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 > ______________________________________________ R-help@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.