Округлить до следующего существенного числа - PullRequest
0 голосов
/ 04 ноября 2019

Я работаю над функцией построения графика и мне нужно определить, где разместить метки оси. При вычислении приращений между каждой меткой я хочу избегать меток на 142, 284 и т. Д., И скорее хотел бы, чтобы они были на 150, 300 и т. Д.

Однако числа не всегда находятся в одном и том же диапазоне. Вот как я планирую округлить их, используя функцию:

  1. между 0 и 1: округлить до первого знака после запятой
  2. между 1 и 10: округлить до целого числа или .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. Как округлить до числа, кратного .5? Кроме того, существует ли альтернативная стандартная функция, которая может использоваться для такого рода проблем с маркировкой?

1 Ответ

1 голос
/ 04 ноября 2019

Я бы предложил использовать dplyr case_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
...