[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