条件陈述;创建新的二进制变量

时间:2013-12-07 03:44:06

标签: r conditional

我有一对二进制变量(1和0),我的教授希望我创建一个新的二进制变量,如果前面的两个变量的值都是1,则取值为1(即x,y = 1 )否则取值为零。

我如何在R?

中这样做

谢谢! JMC

1 个答案:

答案 0 :(得分:3)

以下是一个示例,其中包含一些示例数据:

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

更新(介绍更多替代方案并分享链接和基准)

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

可以看出,ifelse确实比这里提到的其他方法慢得多。有关ifelse的效率的更多详细信息,请参阅this SO question and answer