[R] Vector indexing question
Charles C. Berry
cberry at tajo.ucsd.edu
Fri Mar 30 05:55:49 CEST 2007
On Thu, 29 Mar 2007, 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.
see
?factor
?match ( in case a.id.levels does not actually index a.id.ratings)
?split
> a.ratings.factor <- factor( a.id.ratings[ match(a.id, a.id.levels) ])
> a.vals[ a.ratings.factor == 'e' ]
[1] 105 110 115 120 125 130 135 140 145 150 155 160 165 170 175
>
> split( a.vals, a.ratings.factor ) # more generally
$a
[1] 101 106 111 116 121 126 131 136 141 146 151 156 161 166 171
$b
[1] 102 107 112 117 122 127 132 137 142 147 152 157 162 167 172
[output truncated]
> lm( a.vals ~ a.ratings.factor - 1 ) # means of a.vals
Call:
lm(formula = a.vals ~ a.ratings.factor - 1)
Coefficients:
a.ratings.factora a.ratings.factorb a.ratings.factorc a.ratings.factord a.ratings.factore
136 137 138 139 140
>
> 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?
A warning: using factor() in this way
a.ratings.factor <- factor( a.id, levels=a.id.levels, labels=a.id.ratings )
will work in this case:
a.vals[ a.ratings.factor == 'e' ]
but generally will get you into trouble as its creates a factor with 25
non-unique levels. So,
split( a.vals, a.ratings.factor )
ends up giving a list of 25 (non-uniquely labelled) components
HTH,
Chuck
>
> Thanks,
> --Paul
>
> --
> Paul Lynch
> Aquilent, Inc.
> National Library of Medicine (Contractor)
>
> ______________________________________________
> R-help at 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.
>
Charles C. Berry (858) 534-2098
Dept of Family/Preventive Medicine
E mailto:cberry at tajo.ucsd.edu UC San Diego
http://biostat.ucsd.edu/~cberry/ La Jolla, San Diego 92093-0901
More information about the R-help
mailing list