【发布时间】:2013-12-07 03:44:06
【问题描述】:
我有一对二进制变量(1 和 0),我的教授希望我创建一个新的二进制变量,如果前面的两个变量的值都为 1(即 x,y=1 ),否则取值为零。
我将如何在 R 中做到这一点?
谢谢! 江铃
【问题讨论】:
标签: r conditional
我有一对二进制变量(1 和 0),我的教授希望我创建一个新的二进制变量,如果前面的两个变量的值都为 1(即 x,y=1 ),否则取值为零。
我将如何在 R 中做到这一点?
谢谢! 江铃
【问题讨论】:
标签: r conditional
这是一个示例,其中包含一些可供使用的示例数据:
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。
【讨论】:
ifelse() 更直观,特别是如果有人在来 R 之前有一些基本的编程(不是批评)。您喜欢这些类型的解决方案是否有一个简单的原因?
ifelse() 不是矢量化了吗?我以为是。我知道if(){...} else {...} 没有矢量化,我尽量不使用它。