【问题标题】:Conditional Statements; creating new binary variable条件语句;创建新的二进制变量
【发布时间】:2013-12-07 03:44:06
【问题描述】:

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

我将如何在 R 中做到这一点?

谢谢! 江铃

【问题讨论】:

    标签: r conditional


    【解决方案1】:

    这是一个示例,其中包含一些可供使用的示例数据:

    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

    【讨论】:

    • 谢谢!我不熟悉 rowSums() 函数,它使问题变得容易得多。
    • 您以这种方式处理问题对我来说很有趣。似乎我在 SO 上见过很多次。我认为ifelse() 更直观,特别是如果有人在来 R 之前有一些基本的编程(不是批评)。您喜欢这些类型的解决方案是否有一个简单的原因?
    • @gung,因为 R 是矢量化的,这些方法可能会更快 :-)
    • ifelse() 不是矢量化了吗?我以为是。我知道if(){...} else {...} 没有矢量化,我尽量不使用它。
    • @gung,我现在不在,但稍后会更新一些基准。我似乎也记得一个关于这个的问题,所以我会尽力为你找到它。
    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 2019-10-28
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多