保留R数据框中的数值精度?

时间:2010-12-27 17:54:06

标签: r

当我从数字向量创建数据框时,R似乎会截断低于分析所需精度的值:

data.frame(x=0.99999996)

返回1(*但请参阅更新1)

在拟合spline(x,y)时我陷入困境,并且当y变化时,由于四舍五入,两个x值被设置为1。我可以解决这个问题,但我更愿意使用标准解决方案。

示例

这是一个示例数据集

d <- data.frame(x = c(0.668732936336141, 0.95351462456867,
0.994620622127435, 0.999602102672081, 0.999987126195509, 0.999999955814133,
0.999999999999966), y = c(38.3026509783688, 11.5895099585560,
10.0443344234229, 9.86152339768516, 9.84461434575695, 9.81648333804257,
9.83306725758297))

以下解决方案有效,但我更喜欢不那么主观的东西:

plot(d$x, d$y, ylim=c(0,50))
lines(spline(d$x, d$y),col='grey') #bad fit
lines(spline(d[-c(4:6),]$x, d[-c(4:6),]$y),col='red') #reasonable fit

更新1

*自发布此问题以来,即使数据框仍包含原始值,我也会发现这将返回1,例如

> dput(data.frame(x=0.99999999996))

返回

structure(list(x = 0.99999999996), .Names = "x", row.names = c(NA, 
-1L), class = "data.frame")

更新2

使用dput发布这个示例数据集,以及来自Dirk的一些指针后,我可以看到问题不是截断x值,而是模型中数值误差的限制我曾经用来计算y。这证明了丢弃一些等效数据点(如示例红线所示)。

2 个答案:

答案 0 :(得分:6)

如果您真的想要设置R以完全不合理的精度打印其结果,请使用:options(digits=16)

请注意,这对于使用htese结果的函数的准确性没有任何作用。它只是更改值在打印到控制台时的显示方式。除非您输入的数字比横坐标可以处理的数字更多,否则不会对存储或访问的值进行舍入。 'digits'选项对浮点数的最大精度没有影响。

答案 1 :(得分:5)

请重新阅读R FAQ 7.31及其中引用的参考文献 - 这是一篇非常着名的论文,内容涉及到有关计算机上浮点表示的人应该知道的事情。

Kerngighan和Plauger的结尾语也很棒:

  

10.0倍0.1几乎不是1.0。

除了数值精度问题之外,当然还有R打印的小数位数比内部使用的小:

> for (d in 4:8) print(0.99999996, digits=d)
[1] 1
[1] 1
[1] 1
[1] 1
[1] 0.99999996
>