【问题标题】:cannot round decimals to two decimal places in R不能在 R 中将小数四舍五入到小数点后两位
【发布时间】:2017-12-25 12:35:58
【问题描述】:

我尝试了不同的函数将小数四舍五入为两位数,例如format()formatC()signif()round()。他们都不能真正将所有小数四舍五入到小数点后两位。

比如我的数据框DF有三列:Index、PDF和CDF:

   Index          PDF          CDF
1  -1.00 8.306360e-07 8.306360e-09
2  -0.99 8.332774e-07 1.663913e-08
3  -0.98 8.411712e-07 2.505085e-08
4  -0.97 8.542267e-07 3.359311e-08
5  -0.96 8.722951e-07 4.231606e-08
6  -0.95 8.951719e-07 5.126778e-08
7  -0.94 9.226012e-07 6.049380e-08
8  -0.93 9.542808e-07 7.003660e-08
9  -0.92 9.898679e-07 7.993528e-08
10 -0.91 1.028986e-06 9.022514e-08
...
...
...

Index 列是一个向量,从 -1.00 到 10.00。任何连续元素之间的差为 0.01。这意味着unique(diff(Index)) 应该只返回一个值并且它必须是 0.01。但是,unique(diff(Index)) 可以返回几个 0.01。

我的目的是计算列CDF的任意两个元素之间的差异,这两个元素是通过指示它们的Index来选择的。例如,

a<-DF$CDF[DF$Index==(r+dr)];

b<-DF$CDF[DF$Index==(r-dr)];

res<-a-b;

rIndex 的任意数量,dr 可以是 0.01、0.02 或 0.03。但是,由于Index 的某些元素不能四舍五入为 2 位数字(尽管它们看起来都是这样),因此我无法计算任何 r 和 dr 的 res

我应该如何解决这个问题?提前感谢您的建议!

【问题讨论】:

  • 如果您知道它们绝对是唯一的,为什么不首先确保排序顺序,然后创建一个整数索引1:length(DF$Index)

标签: r floating-point


【解决方案1】:

在函数unique 的某个时刻,该函数必须测试两个索引差异是否相同,并且它可能会使用== 执行此操作。但是,将浮点值与== 进行比较并不是一个好主意。使用您最喜欢的带有“浮点相等”或“浮点比较”的搜索页面,或在http://floating-point-gui.de/errors/comparison/ 阅读有关此问题的信息,您应该始终注意这一点,而不仅仅是针对此特定问题。

在这种情况下,我的建议是:将索引值乘以 100,将它们转换为整数,==(因此unique)可以完美地处理整数。

编辑

感谢下面@hrbrmstr 提供的cmets,我发现您不仅需要as.integer,还需要round 数字,如下面的代码所示

#wrong result due to floating point arithmetic
unique(diff(seq(-1,1,0.1)))

# multiple steps towards a working solution
seq(-1, 1, 0.1)
10*seq(-1, 1, 0.1)
as.integer(round(10*seq(-1, 1, 0.1)))
diff(as.integer(round(10*seq(-1, 1, 0.1))))
unique(diff(as.integer(round(10*seq(-1, 1, 0.1))))) # works!

【讨论】:

  • OP 没有给出一个 mcve (stackoverflow.com/help/mcve),它会产生看似相同但真正独特的值的问题,所以我无法用与他平行的代码来回答这个问题。乘以 100 并转换可以使用 function(x) as.integer(x*100) 完成。
  • 你真的不能用seq(-1.00, 10.00, 0.01)给他们看吗?
  • 我更正并更新了我的答案并添加了一些示例代码。我了解到,必须将as.integerround 结合起来,因为as.integer 显然不会进行舍入,我希望它会这样做。非常感谢您的评论。
  • 感谢您的帮助!! @伯恩哈德
  • 不客气。但是,请考虑@hrbrmstr 在您的问题下的评论,以引入从一开始的完全不同的整数索引。虽然我喜欢在我的建议中保持与原始索引更相似,但您可以用很少且易于阅读的代码构建他的索引,而我的最后一行代码相当难看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多