四舍五入到特定值 r

round to specific value r

提问人:B209978 提问时间:10/13/2023 最后编辑:jpsmithB209978 更新时间:10/13/2023 访问量:77

问:

我有一个坐标列表,我需要以 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 
R 舍入

评论

1赞 Gregor Thomas 10/13/2023
我会通过减去 0.04 来降低您的数据,然后将其四舍五入到最接近的 0.1,然后通过添加 0.04 来撤消移位。(同样,对于 .)LongsLats
1赞 jpsmith 10/13/2023
50.00 四舍五入到什么,50.03 或 49.93?您能否稍微扩展您的示例并添加您想要的这些示例输出?提供的数据没有多大帮助,因为它们已经是所需的格式。祝你好运!Lat
1赞 r2evans 10/13/2023
您想“以 0.1 的间隔舍入”,但随后又说“以 0.04 或 0.03 结束”。听起来你的第一句话是针对另一个问题,而不是你今天要问的问题。请编辑并删除前两句话,或者编辑并添加有关“0.1 间隔”和“0.03/0.04”应该如何兼容的解释。
0赞 r2evans 10/13/2023
那么,他们应该四舍五入到什么?负数应该“向上/向下”四舍五入,而不考虑符号,还是应该从零四舍五入?最后,如果你有坐标,为什么要在 1/100 级别更改值?53.3953.99
0赞 Gregor Thomas 10/13/2023
我的解释是,每个数字都需要四舍五入到与集合最接近的值,尽管当我输入这个时,我意识到在从正值到负值的切换时存在一些不规则性,所以我需要调整我的答案。{..., 0.04, 0.14, 0.24, ... }

答:

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-80