【问题标题】:Round Down to the Nearest 10 [duplicate]向下舍入到最接近的 10 [重复]
【发布时间】:2019-01-09 18:52:29
【问题描述】:

所以我有一列从 10 到 100 的值,我希望所有这些值都四舍五入到最接近的 10。诀窍是我希望它总是向下舍入。例如,55 将变为 50 而不是 60。我想会为此实现 floor,但是当我尝试 floor 时,它只返回相同的值而不改变。

x
10
15
20
27
30
34

等等……

我想要什么:

x
10
10
20
20
30
30

我尝试了什么:

data$x <- floor(data$x)

这只给了我完全相同的值。

【问题讨论】:

    标签: r rounding floor


    【解决方案1】:

    由于floor(x)得到最小整数y不大于x,你可以将x中的所有值除以10,得到下限,然后再乘以10;即,您可以使用floor(x/10) * 10

    x <- c(10,
           15,
           20,
           27,
           30,
           34)
    floor(x/10) * 10
    # [1] 10 10 20 20 30 30
    

    【讨论】:

      【解决方案2】:

      您不需要在这里发言,请与%/% 联系

      v%/%10*10
      [1] 10 10 20 20 30 30
      

      【讨论】:

      • 同样有效。在一个经过微基准测试的样本上,%/%floor 慢一点(慢了大约 50%),但是这两种操作都非常快,以至于很难想象这会成为瓶颈的情况。我鼓励用户选择他们认为最易读的那个。
      • @Gregor 谢谢你的时间! :-)
      【解决方案3】:

      我迟到了,但我确实有一个类似的解决方案,它似乎运行得很快。它类似于其他选项,但使用trunc 函数。

      x<- c(10, 15, 20, 27, 30, 34)
      trunc(x / 10) * 10
      #> [1] 10 10 20 20 30 30
      identical(x %/% 10 * 10, floor(x/10) * 10)
      #> [1] TRUE
      identical(trunc(x / 10) * 10, floor(x/10) * 10)
      #> [1] TRUE
      

      reprex package (v0.2.1) 于 2019 年 1 月 9 日创建

      我扩大了x 向量的大小,并使用microbenchmark 运行所有三个向量。 trunc 方法在此数据上最快。

      set.seed(42)
      x <- sample(x, size = 10000000, replace = TRUE)
      
      library(microbenchmark)
      microbenchmark(trunc(x / 10) * 10,
                     floor(x / 10) * 10, 
                     x%/%10*10)
      #> Unit: milliseconds
      #>              expr       min        lq      mean    median        uq
      #>  trunc(x/10) * 10  55.89856  58.57783  66.08508  65.62727  71.74459
      #>  floor(x/10) * 10  95.50139  99.18817 108.17770 108.10694 113.86548
      #>       x%/%10 * 10 143.65839 150.77401 157.42086 158.56745 161.84987
      #>        max neval
      #>   95.49897   100
      #>  147.47947   100
      #>  188.56060   100
      

      reprex package (v0.2.1) 于 2019-01-09 创建

      【讨论】:

        猜你喜欢
        • 2020-07-01
        • 2013-11-17
        • 1970-01-01
        • 2016-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多