首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R数据帧中保持数值精度?

在R数据帧中保持数值精度?
EN

Stack Overflow用户
提问于 2010-12-27 17:54:06
回答 2查看 9.4K关注 0票数 5

当我从数字向量创建数据时,R似乎截断了我在分析中所要求的精度以下的值:

代码语言:javascript
运行
复制
data.frame(x=0.99999996)

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

当拟合spline(x,y)时,我被困住了,由于y的变化,x值中的两个被设置为1。我可以破解这一点,但我更愿意使用一个标准的解决方案,如果可以的话。

示例

下面是一个示例数据集

代码语言:javascript
运行
复制
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))

以下解决方案有效,但我更喜欢不太主观的解决方案:

代码语言:javascript
运行
复制
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,即使数据框架仍然包含原始值。

代码语言:javascript
运行
复制
> dput(data.frame(x=0.99999999996))

返回

代码语言:javascript
运行
复制
structure(list(x = 0.99999999996), .Names = "x", row.names = c(NA, 
-1L), class = "data.frame")

更新2

在使用dput发布这个示例数据集和一些来自Dirk的指针之后,我可以看到问题不是x值的截断,而是用于计算y的模型中数值误差的限制。这就有理由删除几个等效的数据点(如示例中的红线)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-27 18:10:05

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

请注意,这对使用htese结果的函数的准确性没有任何帮助。它只是在将值打印到控制台时改变了它们的显示方式。在存储或访问这些值时,不需要舍入值,除非您输入比横坐标所能处理的更多的有效数字。“数字”选项对浮点数的最大精度没有影响。

票数 7
EN

Stack Overflow用户

发布于 2010-12-27 17:57:16

请重读R FAQ 7.31和其中引用的参考文献--这是一篇非常著名的论文,讲述了每个人都应该了解计算机上的浮点表示。

Kerngighan和Plauger的结束语也很精彩:

10.0乘以0.1几乎从来都不是1.0。

当然,除了数字精度问题外,R打印的小数比内部使用的要少:

代码语言:javascript
运行
复制
> for (d in 4:8) print(0.99999996, digits=d)
[1] 1
[1] 1
[1] 1
[1] 1
[1] 0.99999996
> 
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4540649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档