从.5开始

jak*_*b-r 54 r rounding r-faq

是的我知道为什么我们总是四舍五入到最近的偶数,如果我们在两个数字的确切中间(即2.5变为2).但是,当我想为某些人评估数据时,他们不希望出现这种行为.获得这个的最简单方法是什么:

x <- seq(0.5,9.5,by=1)
round(x)
Run Code Online (Sandbox Code Playgroud)

为1,2,3,...,10而不是0,2,2,4,4,...,10.

编辑:要清除:舍入后1.4999应为1.(我觉得这很明显)

A5C*_*2T1 59

这不是我自己的功能,不幸的是,我目前无法找到我在哪里获得它(最初是在Statistically Significant博客上发现的匿名评论),但它应该有助于你需要的东西.

round2 = function(x, n) {
  posneg = sign(x)
  z = abs(x)*10^n
  z = z + 0.5
  z = trunc(z)
  z = z/10^n
  z*posneg
}
Run Code Online (Sandbox Code Playgroud)

x是要n舍入的对象,是要舍入的位数.

一个例子

x = c(1.85, 1.54, 1.65, 1.85, 1.84)
round(x, 1)
# [1] 1.8 1.5 1.6 1.8 1.8
round2(x, 1)
# [1] 1.9 1.5 1.7 1.9 1.8
Run Code Online (Sandbox Code Playgroud)

  • janitor 包还添加了此功能,因此这可能是一种无需自己编写即可获得所需行为的简单方法。https://cran.r-project.org/web/packages/janitor/vignettes/janitor.html#directly-consistent-rounding-behavior-with-round_half_up (7认同)
  • 存在数值精度问题,例如“round2(2436.845, 2)”返回“2436.84”。将 `z + 0.5` 更改为 `z + 0.5 + sqrt(.Machine$double.eps)` 似乎对我有用。 (4认同)
  • +1 - 非常好,我现在才意识到你的答案是我的一般化.也许你应该在你的例子中使用`n = 0`,甚至在你的函数中将其设置为默认值.还要注意它以不同的方式处理负数:`round2(-0.5,0)`给出`-1`而我的方法将返回'0`. (2认同)
  • @flodel,不幸的是,我不能赞成这个功能.老实说我不知道​​有那么多[不同的四舍五入方式](http://www.diycalculator.com/popup-m-round.shtml),直到我遇到了R的圆形到均匀的行为并做了一些阅读关于这个话题. (2认同)

flo*_*del 33

如果你想要的东西的行为与round那些xxx.5值完全相同,试试这个:

x <- seq(0, 1, 0.1)
x
# [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
floor(0.5 + x)
# [1] 0 0 0 0 0 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

  • @DoganAskan,这是由于浮点错误。参见 https://www.burns-stat.com/pages/Tutor/R_inferno.pdf 的第 1 圈。如果您有时间,我强烈建议您阅读整个 pdf。 (3认同)
  • 这么简单,我有点怀疑。 (2认同)
  • @jakobr 这取决于您只想四舍五入到整数,而不是任何其他 10 的幂 (2认同)

Jaa*_*aap 8

正如@CarlWitthoft在评论中所说,这是IEC 60559标准,如下所述?round:

注意,为了四舍五入,预计将使用IEC 60559标准,"转到偶数位".因此,round(0.5)为0,round(-1.5)为-2.但是,这取决于OS服务和表示错误(因为例如0.15没有准确表示,舍入规则适用于所表示的数字而不是打印数字,因此舍入(0.15,1)可以是0.1或0.2 ).

Greg Snow 的另一个解释:

圆均匀规则背后的逻辑是我们试图表示一个潜在的连续值,如果x来自一个真正连续的分布,那么x == 2.5的概率为0而2.5可能已经从任何值舍入一次在2.45和2.54999999999999之间...,如果我们使用我们在小学学习的0.5规则的舍入,那么双舍入意味着2.45和2.50之间的值将全部舍入到3(首先舍入到2.5).这往往会使估计偏向上升.为了消除这种偏见,我们需要在四舍五入之前回到2.5(这通常不可能是不切实际的),或者只是将一半的时间向上舍入并向下舍入一半的时间(或者更好的是与我们的可能性成比例要看低于或高于2.5的值四舍五入为2.5,但对于大多数基础分布,这将接近50/50).随机方法是让圆函数随机选择哪种方式进行舍入,但确定性类型不能与之相配,因此选择"舍入到偶数"(舍入到奇数应该大致相同)作为舍入的一致规则上下约50/50.

如果您正在处理2.5可能代表精确值(例如金钱)的数据,那么您可以通过将所有值乘以10或100并以整数运算,然后仅转换回最终打印来做得更好.请注意,2.50000001舍入为3,因此如果在最终打印之前保留更多精度数字,则舍入将按预期方向进行,或者您可以在舍入之前将值添加0.000000001(或其他小数字),但这可以向上偏向你的估计.


use*_*990 6

这似乎起作用:

rnd <- function(x) trunc(x+sign(x)*0.5)
Run Code Online (Sandbox Code Playgroud)

阿南达·马赫托(Ananda Mahto)的回应似乎不仅可以做到这一点,而且还可以做更多-我不确定他回应中的额外代码占了什么;或者换句话说,我不知道如何破坏上面定义的rnd()函数。

例:

seq(-2, 2, by=0.5)
#  [1] -2.0 -1.5 -1.0 -0.5  0.0  0.5  1.0  1.5  2.0
round(x)
#  [1] -2 -2 -1  0  0  0  1  2  2
rnd(x)
#  [1] -2 -2 -1 -1  0  1  1  2  2
Run Code Online (Sandbox Code Playgroud)

  • 您发布了整个功能吗?您发布的`rdn`函数仅接受一个参数(输入向量),但显示它与两个参数一起使用。我发布的函数也尝试将舍入到其他位值。例如,当x = c(1.855,1.545,1.655,1.855,1.845)时,比较round(x,2)和round2(x,2)之间的差异。 (2认同)

Mic*_*ico 6

根据您对微调数据的舒适程度,这有效:

round(x+10*.Machine$double.eps)
# [1]  1  2  3  4  5  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

  • 如果将 $sign(x)$ 因子添加到小数中,它会复制 Excel 的负数从零舍入的行为 (2认同)