user3076619
user3076619

Reputation: 53

Conditional Statements; creating new binary variable

I have a pair of binary variables (1's and 0's), and my professor wants me to create a new binary variable that takes the value 1 if both of the previous variables have the value 1 (i.e., x,y=1) and takes the value zero otherwise.

How would I do this in R?

Thanks! JMC

Upvotes: 1

Views: 1296

Answers (1)

A5C1D2H2I1M1N2O1R2T1
A5C1D2H2I1M1N2O1R2T1

Reputation: 193517

Here's one example with some sample data to play with:

set.seed(1)
A <- sample(0:1, 10, replace = TRUE)
B <- sample(0:1, 10, replace = TRUE)
A
#  [1] 0 0 1 1 0 1 1 1 1 0
B
#  [1] 0 0 1 0 1 0 1 1 0 1

as.numeric(A + B == 2)
#  [1] 0 0 1 0 0 0 1 1 0 0

as.numeric(rowSums(cbind(A, B)) == 2)
#  [1] 0 0 1 0 0 0 1 1 0 0

as.numeric(A == 1 & B == 1)
# [1] 0 0 1 0 0 0 1 1 0 0

Update (to introduce some more alternatives and share a link and a benchmark)

set.seed(1)
A <- sample(0:1, 1e7, replace = TRUE)
B <- sample(0:1, 1e7, replace = TRUE)

fun1 <- function() ifelse(A == 1 & B == 1, 1, 0)
fun2 <- function() as.numeric(A + B == 2)
fun3 <- function() as.numeric(A & B)
fun4 <- function() as.numeric(A == 1 & B == 1)
fun5 <- function() as.numeric(rowSums(cbind(A, B)) == 2)

library(microbenchmark)
microbenchmark(fun1(), fun2(), fun3(), fun4(), fun5(), times = 5)
# Unit: milliseconds
#   expr       min        lq    median        uq        max neval
# fun1() 4842.8559 4871.7072 5022.3525 5093.5932 10424.6589     5
# fun2()  220.8336  220.9867  226.1167  229.1225   472.4408     5
# fun3()  440.7427  445.9342  461.0114  462.6184   488.6627     5
# fun4()  604.1791  613.9284  630.4838  645.2146   682.4689     5
# fun5()  373.8088  373.8532  373.9460  435.0385  1084.6227     5

As can be seen, ifelse is indeed much slower than the other approaches mentioned here. See this SO question and answer for some more details about the efficiency of ifelse.

Upvotes: 3

Related Questions