【问题标题】:Convert values below a threshold into 1将低于阈值的值转换为 1
【发布时间】:2015-10-05 10:40:07
【问题描述】:

假设我有以下数据

x <- rnorm(100)

我想创建另一个列,其中如果x 等于或大于 0.2,则为其赋值 1,否则为 0。

【问题讨论】:

    标签: r if-statement


    【解决方案1】:

    我们可以创建逻辑条件并用+包装

    xNew <- +(x >=0.2)
    

    如果我们需要data.frame

    dat <- data.frame(x, xNew)
    

    或使用ifelse

    xNew <- ifelse(x >= 0.2, 1, 0) 
    

    【讨论】:

    • 将 TRUE 或 FALSE 转换为整数 -> 0 表示 FALSE 或 1 表示 TRUE
    • @user1945827 使用+ 将逻辑 TRUE/FALSE 强制转换为二进制 1/0
    • 这是一种将逻辑值转换为数字的巧妙方法。你也可以使用as.numeric
    • @hrbrmstr thnx ... 计算出 as.numeric 但看不到 + 是如何工作的(我发现减号也返回 -1s!)。
    • @hrbrmstr 和 as.integer 更快(并且使意图更加明显)。
    【解决方案2】:

    您想使用 Heaviside 函数。例如,您可以在 fbasics 包中找到它。

    set.seed(42)
    x <- rnorm(100)
    library(fBasics)
    Heaviside(x, 0.2)
    

    【讨论】:

    • 整洁的方式。这必须是解决方案。
    • 什么都没有,因为它提供了结果!但是数学方法比 IT 方法要简洁得多(函数自己说话,更多的函数式编程):)
    • 查看我的非答案基准“答案”。这完全不是你想要做的。
    • @ColonelBeauvel 我能理解。这里没有任何惊喜:-)
    【解决方案3】:

    这样做是为了上校的利益:

    library(microbenchmark)
    
    set.seed(1492)
    x <- rnorm(10000)
    
    microbenchmark(asi=as.integer(x >= 0.2),
                   asn=as.numeric(x >= 0.2),
                   pls=+(x >=0.2),
                   hsd=Heaviside(x, 0.2))
    
    ## Unit: microseconds
    ##  expr    min      lq      mean  median      uq      max neval cld
    ##   asi 18.351 20.7575  27.88867 22.4250 22.8695  598.206   100  a 
    ##   asn 23.710 25.9740  32.77422 29.2405 29.9860  340.234   100  a 
    ##   pls 17.989 20.2640  26.07038 22.6855 23.3020  320.443   100  a 
    ##   hsd 88.493 92.2145 148.17850 94.1935 95.5250 2831.695   100   b
    

    Heaviside 完全不是如果您完全关心性能,您想要做的事情。而且,它只是在做:

    function (x, a = 0) {
      result = (sign(x - a) + 1)/2
      result
    }
    

    无论如何。

    【讨论】:

    • 比较 +as.numeric 是不公平的比较。前者返回integer
    • 那么当您将快速代码包装到您自己的Heaviside 函数中时会发生什么?毕竟,没有人愿意用难以理解的黑客来乱扔他们的代码库,而函数正是为了解决这个问题。 (编辑:试过了。它几乎与最快的解决方案相当。这令人放心。)
    • +() 怎么听不懂? “一元 + 和一元 - 返回一个数字或复数向量。如果没有强制转换,所有属性(包括类)都将保留:逻辑 x 被强制转换为整数,名称、dim 和 dimnames 被保留。” (来自help(+)
    猜你喜欢
    • 2023-04-04
    • 2016-09-06
    • 2012-10-07
    • 1970-01-01
    • 2013-12-21
    • 2020-11-21
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多