Есть ли способ провести округление по пользовательским правилам? - PullRequest
0 голосов
/ 31 января 2019

Мне интересно, есть ли способ округления вверх или вниз на основе моих собственных правил, а не только базовых 0,5 вверх или вниз.Числа, которые я пытаюсь округлить, имеют форму 24-часового времени, то есть 2250, 1100, 830 (но в числовом формате), и я хочу округлить в большую или меньшую сторону в зависимости от того, являются ли последние два числа выше или ниже 30 -и это округляется до следующего часа.Буду признателен за любую помощь, спасибо.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы можете просто сместить числа перед округлением их:

round(c(2250, 1100, 830) + 20, -2)
# [1] 2300 1100  800

Вы можете добавить %% 2400 к нему:

round(2350 + 20, -2)
# [1] 2400
round(2350 + 20, -2) %% 2400
# [1] 0

Так что будет:

round_hour <- function(x) round(x + 20, -2) %% 2400

Спасибо @snoram за подсказку

0 голосов
/ 31 января 2019

Что-то в этом роде?

# Function
hround <- function(x) {
  if (any(x < 0 | x > 24000)) stop("Invalid format")
  mins <- x %% 100
  x <- x - mins + ifelse(mins >= 30, 100, 0)
  ifelse(x == 2400, 0, x)
}
# test data:
test <- c(2250, 1100, 830, 725)

# Test run
hround(test)
# [1] 2300 1100  900  700
...