提问人:B209978 提问时间:10/13/2023 最后编辑:jpsmithB209978 更新时间:10/13/2023 访问量:77
四舍五入到特定值 r
round to specific value r
问:
我有一个坐标列表,我需要以 0.1 的间隔四舍五入
很简单(不确定这是否最有效,但它有效并且不是今天的问题。mutate(Long=round(Long/0.1)*0.1
问题是我需要四舍五入以匹配以下内容(所有多头都以 0.04 结尾,纬度以 0.03 结尾)
例如,纬度 53.15 通常会向上舍入到 53.2,但我需要它向下舍入到 53.13
Long Lat
1 -3.24 53.13
2 -3.14 53.13
3 -3.04 53.13
4 -2.94 53.13
5 -2.84 53.13
6 -2.74 53.13
答:
3赞
Gregor Thomas
10/13/2023
#1
您可以移动数据,以便将其舍入到方便的值,然后取消移动。(这要归功于这个答案,因为没有偏移量的圆形逻辑。
round_offset = function(x, precision, offset) {
round((x - offset * sign(x)) / precision) * precision + offset * sign(x)
}
下面的演示 - 我们可以看到所有值都以 0.04 结尾,并且与原始值的差异都小于 0.05,因此它似乎工作正常。rounded
set.seed(47)
xx = seq(-0.3, 0.8, by = 0.1)
xx = xx + runif(length(xx), min = -.05, max = .05)
result = cbind(xx, rounded = round_offset(xx, precision = 0.1, offset = 0.04))
cbind(result, diff = result[, 2] - result[, 1])
# xx rounded diff
# [1,] -0.25230380 -0.24 0.012303800
# [2,] -0.21260840 -0.24 -0.027391605
# [3,] -0.07384980 -0.04 0.033849797
# [4,] 0.03224916 0.04 0.007750839
# [5,] 0.10735444 0.14 0.032645558
# [6,] 0.21914124 0.24 0.020858757
# [7,] 0.28890619 0.24 -0.048906185
# [8,] 0.39689460 0.44 0.043105403
# [9,] 0.50433097 0.54 0.035669026
# [10,] 0.64248920 0.64 -0.002489205
# [11,] 0.66387976 0.64 -0.023879758
# [12,] 0.82019872 0.84 0.019801280
请注意,0 不会四舍五入,因为它与 -0.04 和 0.04 的距离相等。如果你想让 0 四舍五入,我会在应用此算法后将其作为异常处理。(或者,也许通过稍微推动输入,如果您添加到您的输入中,则将四舍五入,其他任何内容都不会受到影响。1e-8
0
评论
Longs
Lats
Lat
53.39
53.99
{..., 0.04, 0.14, 0.24, ... }