# [R] alternative to ifelse

arun smartpink111 at yahoo.com
Wed Jun 19 21:14:57 CEST 2013

```Hi,
May bet this also helps:
set.seed(12345)
x <- c(1:30)
x1 <- sample(x, 15, replace = TRUE)
x2 <- sample(x, 15, replace = TRUE)
x3 <- sample(x, 15, replace = TRUE)
x4 <- sample(x, 15, replace = TRUE)

indx<-1+2*(x1==1)+4*(x2==1)+8*(x3==1)+16*(x4==1)
as.numeric(indx!=1)
#[1] 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0

#Speed comparisons
set.seed(1235)
x <- c(1:1e7)
x1 <- sample(x, 1e7, replace = TRUE)
x2 <- sample(x, 1e7, replace = TRUE)
x3 <- sample(x, 1e7, replace = TRUE)
x4 <- sample(x, 1e7, replace = TRUE)

system.time(res1 <-ifelse(x1 == 1 | x2 == 1 | x3 == 1 | x4 == 1, 1, 0))
# user  system elapsed
# 3.740   0.256   4.003

system.time(res2<-as.numeric(x1 == 1 | x2 == 1 | x3 == 1 | x4 == 1))
# user  system elapsed
#  0.996   0.076   1.077

system.time({indx<-1+2*(x1==1)+4*(x2==1)+8*(x3==1)+16*(x4==1)
res3<-as.numeric(indx!=1)})
# user  system elapsed
#  0.596   0.240   0.840

system.time(res4<-rowSums(cbind(x1, x2, x3, x4) == 1))
# user  system elapsed
#  0.732   0.192   0.926

system.time(res4New<-sign(rowSums(cbind(x1, x2, x3, x4) == 1)))
# user  system elapsed
# 0.824   0.232   1.062

X <- cbind(x1, x2, x3, x4)
system.time({
res5<-as.integer(apply(X, 1, function(x) any(x == 1L)))})
# user  system elapsed
#113.308   0.208 113.729

system.time(res6<-apply(X, 1, function(x) if (any(x == 1L)) 1 else 0))
#user  system elapsed
# 61.660   0.216  61.989

identical(res1,res6)
#[1] TRUE

identical(res1,res2)
#[1] TRUE
identical(res1,res3)
#[1] TRUE

identical(res1,res4)
#[1] TRUE
identical(res1,res4New)
#[1] TRUE
A.K.

----- Original Message -----
From: Brian Perron <beperron at umich.edu>
To: r-help at r-project.org
Cc:
Sent: Wednesday, June 19, 2013 9:24 AM
Subject: [R] alternative to ifelse

Greetings:

I am looking for a way to avoid using the ifelse function for
constructing a new variable.  More specifically, assume I have a set
of variables with scores ranging from 1 to 30.

set.seed(12345)
x <- c(1:30)
x1 <- sample(x, 15, replace = TRUE)
x2 <- sample(x, 15, replace = TRUE)
x3 <- sample(x, 15, replace = TRUE)
x4 <- sample(x, 15, replace = TRUE)

I want to construct a dichotomous variable that tests whether any of
the variables contains the value 1.

newVar <-ifelse(x1 == 1 | x2 == 1 | x3 == 1 | x4 == 1, 1, 0)

I want to avoid the ifelse function because I have a number of large
variable lists that will require new variables to be created.  I'm
sure there is a simple way to do this, but I haven't had any luck with
my search!

Brian

______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help