我基本上是在寻找一种方法来做一些变化这个 Ruby 脚本 https://stackoverflow.com/questions/3160502/ruby-round-number-down-to-nearest-number-based-on-arbitrary-list-of-numbers in 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 的函数是最快的,比 Tyler Rinker 的第二个函数快大约 5 倍。