【问题标题】:Round up to next salient number向上舍入到下一个显着数字
【发布时间】:2019-11-04 08:34:20
【问题描述】:

我正在研究绘图功能,需要定义放置轴标签的位置。在计算每个标签之间的增量时,我希望避免使用 142、284 等处的标签,而希望它们位于 150、300 等处。

但是,这些数字并不总是在同一范围内。以下是我计划使用函数对它们进行四舍五入的方法:

  1. 介于 0 和 1 之间:向上舍入到小数点后一位
  2. 介于 1 和 10 之间:向上舍入为整数或 0.5
  3. 11 到 20 之间:向上取整为整数
  4. 介于 21 和 100 之间:向上舍入为 5 的倍数
  5. 101 到 200 之间:向上取整为 10 的倍数
  6. 201 到 1000 之间:向上取整为 50 的倍数
  7. 在 1001 到 2000 之间:向上取整为 100 的倍数
  8. 在 2001 到 10000 之间:向上取整为 500 的倍数

我的问题在于数字 2。如何四舍五入到 0.5 的倍数?另外,是否有替代标准函数可用于处理此类标签问题?

【问题讨论】:

标签: r rounding


【解决方案1】:

我建议使用dplyrcase_when 来制定一套这样的规则。

library(dplyr)
my_format <- function(x) {
  case_when(
    between(x, 0,     1)     ~ ceiling(x / .1 ) * .1,
    between(x, 1,     10)    ~ ceiling(x / .5 ) * .5,
    between(x, 11,    20)    ~ ceiling(x / 1  ) * 1,
    between(x, 21,    100)   ~ ceiling(x / 5  ) * 5,
    between(x, 101,   200)   ~ ceiling(x / 10 ) * 10,
    between(x, 201,   1000)  ~ ceiling(x / 50 ) * 50,
    between(x, 1001,  2000)  ~ ceiling(x / 100) * 100,
    between(x, 2001,  10000) ~ ceiling(x / 500) * 500
  )
}

my_format(0.44)
#> [1] 0.5
my_format(4.1)
#> [1] 4.5
my_format(4.51)
#> [1] 5
my_format(11.1)
#> [1] 12
my_format(22.5)
#> [1] 25
my_format(121.1)
#> [1] 130
my_format(201.1)
#> [1] 250
my_format(1002.3)
#> [1] 1100
my_format(2001.1)
#> [1] 2500

【讨论】:

  • 可能适用于当前问题,现在想象一下这个“四舍五入”一直到数十亿。
  • 我认为问题中没有这种可能性。但是,是的,那时这行不通,需要找到更通用的功能。
  • 但欢迎任何能提供更一般形式的人发帖!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多