[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