【问题标题】:Replace all values lower than threshold in R替换R中所有低于阈值的值
【发布时间】:2013-12-21 12:31:06
【问题描述】:

我有一个向量

x <- c(-1, 0, 1, 2, 3)

我希望所有小于 1 的值都被 1 替换。

怎么做?

有没有无循环的解决方案?

【问题讨论】:

  • 环顾四周,我遇到了thisthis,这可能很有用。

标签: r


【解决方案1】:

使用带替换的逻辑索引:

x[ x<1 ] <- 1

【讨论】:

  • 这是@Jilber 链接到的基准测试中的获胜者之一。我曾经使用pmaxpmin,但我想我会切换。这同样具有可读性,并且具有我不会错误地使用 pmin 来设置最小值的优点。
  • 如何对数据表的所有列执行此操作?如果有文本值,请避免任何错误
【解决方案2】:

pmax 是一个很好的候选人

  > pmax(x, 1)
    [1] 1 1 1 2 3

【讨论】:

    【解决方案3】:

    其他解决方案更合适。这只是为了好玩:

    (x > 1) * (x - 1) + 1
    #[1] 1 1 1 2 3
    

    简单替换 (@Matthew Lundberg) 是最有效的解决方案:

    library(microbenchmark)
    microbenchmark(pmax(1, x),
                   "[<-"(x, x < 1, 1),
                   (x > 1) * (x - 1) + 1)
    
    # Unit: microseconds
    #                   expr    min      lq  median      uq    max neval
    #             pmax(1, x) 15.494 16.2545 16.5165 16.9365 52.165   100
    #     `[<-`(x, x < 1, 1)  1.466  1.6920  2.3325  2.7485 23.683   100
    #  (x > 1) * (x - 1) + 1  2.084  2.2870  2.7880  3.2080  8.958   100
    

    【讨论】:

    • @lebatsnok 这更具可读性,但您需要进行两次比较。
    • 好的,但这里有一些更有趣的东西(如果你仔细想想,也许还挺易读的):(foo &lt;- x &lt;1)*1 + (!foo)*x
    • @lebatsnok 好主意。你可以省略*1
    • (function(C) C + (!C) * x)(x&lt;1)
    • 几年后重新审视这个问题,我得到的替换和问题中x 的表达之间的差异要小得多,但替换的最大值较低。但是,如果您使用更长的向量,那么我们的两种方法的结果就是洗牌,pmax 显然是赢家。 (x &lt;- sample(c(-1,0,1,2,3), 1e7, replace=TRUE))
    【解决方案4】:

    另一个选项是replace:

    x <- c(-1, 0, 1, 2, 3)
    
    replace(x, x < 1,1)
    # [1] 1 1 1 2 3
    

    【讨论】:

      猜你喜欢
      • 2019-09-14
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      相关资源
      最近更新 更多