四舍五入到最接近的 10

Round Down to the Nearest 10

所以我有一列值从 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)

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

由于floor(x)得到的是不大于x的最小整数y,所以可以将x中的所有值除以十,取底数,然后相乘十点回来;即,您可以使用 floor(x/10) * 10

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

您不需要在此处查看 %/%

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

我迟到了,但我确实有一个类似的解决方案,似乎 运行 相当快。它与其他选项类似,但使用 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-01-09 创建

我已经用 microbenchmark 扩大了 x 向量和 运行 所有三个向量的大小。 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 创建