[R] Neat conditional assignment

Gabor Grothendieck ggrothendieck at gmail.com
Tue Dec 11 02:30:03 CET 2007


On Dec 10, 2007 6:52 PM, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> With this specific example this will work:
>
>   as.numeric(factor(a))
>
> If that is not the real case but its something else you could try any
> of these which probably generalize better:
>
>   (a == "A") + 2 * (a == "B")
>   1 + (a == "B")
>   ifelse(a == "A", 1, 2)


Just in case this wasn't clear:

> a<-rep(c("A","B"),50)
> b<-rep(1,100)
> c<-rep(2,100)
>
> b * (a == "A") + c * (a == "B")
  [1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
 [38] 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
 [75] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
> b + (c-b) * (a == "B")
  [1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
 [38] 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
 [75] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
> ifelse(a == "A", b, c)
  [1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
 [38] 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
 [75] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
>
>

>
>
> On Dec 10, 2007 6:41 PM, Neil Stewart <neil.stewart at warwick.ac.uk> wrote:
> > 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
> >
> > ______________________________________________
> > R-help at r-project.org 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.
> >
>



More information about the R-help mailing list