从R中的.5进行整理

是的,我知道为什么我们总是凑到最接近的偶数,如果我们在两个数字的中间(即2.5变成2)。 但是当我想要评估某些人的数据时,他们不想要这种行为。 什么是最简单的方法来得到这个:

x <- seq(0.5,9.5,by=1) round(x) 

为1,2,3,…,10而不是0,2,2,4,4,…,10。

编辑:要清除:1.4999四舍五入后应为1。 (我认为这将是显而易见的)

这不是我自己的function,不幸的是, 我现在无法find我的位置 (最初在统计意义博客中发现的匿名评论),但它应该帮助您满足您的需求。

 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 } 

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 

如果你想要的东西,除了那些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 

这似乎工作:

 rnd <- function(x) trunc(x+sign(x)*0.5) 

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 

正如@CarlWitthoft在评论中所说,这是第6 ?round提到的IEC 60559标准:

请注意,为了舍入5,IEC 60559标准预计将被使用,“去偶数”。 因此,round(0.5)是0,round(-1.5)是-2。 但是,这取决于操作系统服务和表示错误(因为例如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)。 随机方法是让轮回函数随机select轮回的方式,但是确定性types与此不一致,所以select“轮到偶”(循环到奇数应该是相同的)作为一致的规则,循环上下大约50/50。

如果你正在处理的数据可能代表一个确切的数值(例如金钱),那么你可以通过将所有值乘以10或100并以整数值工作,然后转换回最后的打印值来做得更好。 请注意,2.50000001轮到3,所以如果你保留更多的精度直到最后的印刷数字,那么舍入将按预期的方向,或者可以在舍入之前将0.000000001(或其他小数)添加到您的值,但是可以向上倾斜你的估计。

根据您摆弄数据的方式,这是有效的:

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