[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