Как округлить до 10 (или 100 или X)? - PullRequest
76 голосов
/ 24 июня 2011

Я пишу функцию для построения графика данных. Я хотел бы указать хорошее круглое число для оси Y max, которое больше, чем максимум набора данных.

В частности, я хотел бы функцию foo, которая выполняет следующее:

foo(4) == 5
foo(6.1) == 10 #maybe 7 would be better
foo(30.1) == 40
foo(100.1) == 110 

Я дошел до

foo <- function(x) ceiling(max(x)/10)*10

для округления до ближайших 10, но это не работает для произвольных интервалов округления.

Есть ли лучший способ сделать это в R?

Ответы [ 11 ]

0 голосов
/ 07 сентября 2016

Вы найдете обновленную версию Ответ Томми , который учитывает несколько случаев:

  • Выбор между нижней или верхней границей
  • С учетом отрицательногои нулевые значения
  • две разные хорошие шкалы, если вы хотите, чтобы функция округляла по-разному маленькие и большие числа.Пример: 4 будет округлено до 0, а 400 будет округлено до 400.

Ниже кода:

round.up.nice <- function(x, lower_bound = TRUE, nice_small=c(0,5,10), nice_big=c(1,2,3,4,5,6,7,8,9,10)) {
  if (abs(x) > 100) {
    nice = nice_big
  } else {
    nice = nice_small
  }
  if (lower_bound == TRUE) {
    if (x > 0) {
      return(10^floor(log10(x)) * nice[[max(which(x >= 10^floor(log10(x)) * nice))[[1]]]])
    } else if (x < 0) {
      return(- 10^floor(log10(-x)) * nice[[min(which(-x <= 10^floor(log10(-x)) * nice))[[1]]]])
    } else {
      return(0)
    }
  } else {
    if (x > 0) {
      return(10^floor(log10(x)) * nice[[min(which(x <= 10^floor(log10(x)) * nice))[[1]]]])
    } else if (x < 0) {
      return(- 10^floor(log10(-x)) * nice[[max(which(-x >= 10^floor(log10(-x)) * nice))[[1]]]])
    } else {
      return(0)
    }
  }
}
...