В основном я ищу способ сделать вариант этого Ruby script в R.
У меня есть произвольный список чисел (шаги модератора для графика регрессии в этом случае), которые имеют неравные расстояния друг от друга, и я хотел бы округлять значения, которые находятся в пределах диапазона вокруг этих номера до ближайшего номера в списке.
Диапазоны не перекрываются.
arbitrary.numbers <- c(4,10,15) / 10
numbers <- c(16:1 / 10, 0.39, 1.45)
range <- 0.1
Ожидаемый результат:
numbers
## 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0.39 1.45
round_to_nearest_neighbour_in_range(numbers,arbitrary.numbers,range)
## 1.5 1.5 1.5 1.3 1.2 1.0 1.0 1.0 0.8 0.7 0.6 0.4 0.4 0.4 0.2 0.1 0.4 1.5
У меня есть небольшая вспомогательная функция, которая может сделать для моей конкретной проблемы, но она не очень гибкая и содержит цикл. Я могу опубликовать его здесь, но я думаю, что реальное решение будет выглядеть совершенно иначе.
Различные ответы, рассчитанные на скорость (на миллион номеров)
> numbers = rep(numbers,length.out = 1000000)
> system.time({ mvg.round(numbers,arbitrary.numbers,range) })[3]
elapsed
0.067
> system.time({ rinker.loop.round(numbers,arbitrary.numbers,range) })[3]
elapsed
0.289
> system.time({ rinker.round(numbers,arbitrary.numbers,range) })[3]
elapsed
1.403
> system.time({ nograpes.round(numbers,arbitrary.numbers,range) })[3]
elapsed
1.971
> system.time({ january.round(numbers,arbitrary.numbers,range) })[3]
elapsed
16.12
> system.time({ shariff.round(numbers,arbitrary.numbers,range) })[3]
elapsed
15.833
> system.time({ mplourde.round(numbers,arbitrary.numbers,range) })[3]
elapsed
9.613
> system.time({ kohske.round(numbers,arbitrary.numbers,range) })[3]
elapsed
26.274
Функция MvG является самой быстрой, примерно в 5 раз быстрее, чем вторая функция Тайлера Ринкера.