R 条件语句;创建新的二进制变量
我有一对二进制变量(1和0),我的教授希望我创建一个新的二进制变量,如果前面的两个变量都有值1(即x,y=1),则取值1,否则取值0 我在R怎么做 谢谢!R 条件语句;创建新的二进制变量,r,conditional,R,Conditional,我有一对二进制变量(1和0),我的教授希望我创建一个新的二进制变量,如果前面的两个变量都有值1(即x,y=1),则取值1,否则取值0 我在R怎么做 谢谢! JMC有一个示例,其中包含一些示例数据: 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
JMC有一个示例,其中包含一些示例数据:
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谢谢!我不熟悉rowSums()函数,它使问题变得容易得多。我很感兴趣的是,您以这种方式处理问题。看起来我已经见过很多次了。我认为ifelse()
更直观,特别是如果有人在来到R之前有一些基本的编程(不是批评)。您喜欢这些类型的解决方案有一个简单的原因吗?@gung,因为R是矢量化的,而且这些方法可能更快:-)不是ifelse()
矢量化的吗?我以为是的。我知道if(){…}else{…}
没有矢量化,&我尽量不使用它。@gung,我现在出去了,但稍后会用一些基准更新。我似乎还记得一个关于这件事的问题,所以我会尽力帮你找到。
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