[R] Neat conditional assignment

Neil Stewart neil.stewart at warwick.ac.uk
Tue Dec 11 00:41:34 CET 2007


I would like to make a new vector with values taken from two existing
vectors conditional upon a third. At present I am doing this with a for loop
but wonder if there is not a neater way, given some of the very neat things
R can do.

a<-rep(c("A","B"),50)
b<-rep(1,100)
c<-rep(2,100)

a is thus "A" "B" "A" "B" "A" "B"...
b is thus 1 1 1 1 1 1 ...
c is thus 2 2 2 2 2 2 ...

I want d[i] to be b[i] if a[i]=="A" and c[i] if a[i]=="B". I'm current using
a for loop:

d<-rep(0,100)     # initialise d
for(i in 1:length(a)) {if(a[i]=="A") d[i]<-b[i] else d[i]<-c[i]}

d is thus 1 2 1 2 1 2 1 2 1 ...

Is it possible to do something simpler, say along the lines of the c-style
?: conditional statement, or at least avoiding the for loop.

d <- a=="A"?b:c   # doesn't work, but you get the idea

Thanks in advance,
Neil



More information about the R-help mailing list