R 从0.5汇总

R 从0.5汇总,r,rounding,r-faq,R,Rounding,R Faq,是的,我知道为什么我们总是四舍五入到最近的偶数,如果我们在两个数的中间(即2.5变成2)。但当我想为一些人评估数据时,他们不希望出现这种行为。最简单的方法是什么: x <- seq(0.5,9.5,by=1) round(x) x这不是我自己的函数,不幸的是,我现在找不到我从哪里得到它(最初是作为匿名评论在网站上找到的),但它应该可以帮助您实现所需的功能 round2 = function(x, n) { posneg = sign(x) z = abs(x)*10^n z

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

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

x这不是我自己的函数,不幸的是,我现在找不到我从哪里得到它(最初是作为匿名评论在网站上找到的),但它应该可以帮助您实现所需的功能

round2 = function(x, n) {
  posneg = sign(x)
  z = abs(x)*10^n
  z = z + 0.5 + sqrt(.Machine$double.eps)
  z = trunc(z)
  z = z/10^n
  z*posneg
}
x
是要舍入的对象,
n
是要舍入的位数

示例


(感谢@Gregor添加了
+sqrt(.Machine$double.eps)

这不是我自己的功能,不幸的是,我现在找不到我从哪里得到它(最初是在网站上以匿名评论的形式找到的),但它应该可以帮助您满足需要

round2 = function(x, n) {
  posneg = sign(x)
  z = abs(x)*10^n
  z = z + 0.5 + sqrt(.Machine$double.eps)
  z = trunc(z)
  z = z/10^n
  z*posneg
}
x
是要舍入的对象,
n
是要舍入的位数

示例


(感谢@Gregor添加了
+sqrt(.Machine$double.eps)

如果你想要的东西除了那些xxx.5的值外,表现得完全像
round
,请尝试以下方法:

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

x如果除了那些xxx.5值之外,您想要的东西的行为与
round
完全相同,请尝试以下方法:

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
x这似乎有效:

rnd <- function(x) trunc(x+sign(x)*0.5)
这似乎有效:

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

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

请注意,对于5的四舍五入,预计将使用IEC 60559标准“至偶数”。因此,整数(0.5)为0,整数(-1.5)为-2。但是,这取决于操作系统服务和表示错误(例如,0.15没有准确表示,舍入规则适用于表示的数字而不是打印的数字,因此舍入(0.15,1)可以是0.1或0.2)

格雷格·斯诺的一篇文章:

本轮谈判的逻辑是,我们正试图 表示一个基本的连续值,如果x来自 连续分布,则x==2.5的概率为0 2.5可能已经从2.45和2.5499999999999之间的任何值中四舍五入了一次…,如果我们使用我们在小学学到的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(或 在四舍五入之前,将其他小数值)转换为您的值,但这可以 把你的估计向上倾斜


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

请注意,对于5的四舍五入,预计将使用IEC 60559标准“至偶数”。因此,整数(0.5)为0,整数(-1.5)为-2。但是,这取决于操作系统服务和表示错误(例如,0.15没有准确表示,舍入规则适用于表示的数字而不是打印的数字,因此舍入(0.15,1)可以是0.1或0.2)

格雷格·斯诺的一篇文章:

本轮谈判的逻辑是,我们正试图 表示一个基本的连续值,如果x来自 连续分布,则x==2.5的概率为0 2.5可能已经从2.45和2.5499999999999之间的任何值中四舍五入了一次…,如果我们使用我们在小学学到的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(或 在四舍五入之前,将其他小数值)转换为您的值,
-2 -1  1  2  3  4  5
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
}
round2 = function(x, n) {
  posneg = sign(x)
  z = abs(x)*10^n
  z = z + 0.5
  z = trunc(as.numeric(as.character(z)))
  z = z/10^n
  (z)*posneg
}