我一直试图读取一个包含日期字段和数字字段的文件。我将数据保存在Excel工作表中,如下所示-
Date X
1/25/2008 0.0023456
12/23/2008 0.001987
当我使用 readxl :: read_xlsx 函数在R中阅读此内容时,R中的数据如下所示-
Date X
1/25/2008 0.0023456000000000
12/23/2009 0.0019870000000000
我尝试使用舍入,格式(nsmall = 7)等功能限制数字,但似乎无济于事。我究竟做错了什么?我还尝试将数据另存为csv和txt,并使用read.csv和read.delim进行读取,但我再次遇到相同的问题。任何帮助将不胜感激!
答案 0 :(得分:1)
library(formattable)
x <- formattable(x, digits = 7, format = "f")
或者您可能想要添加它以从R获取默认格式:
options(defaultPackages = "")
然后,重新启动R。
答案 1 :(得分:1)
也许问题不是您的源文件,因为您说的是.csv和.txt也会发生这种情况。
通过运行options()$digits
如果结果是14那可能是问题所在。
在这种情况下,请尝试运行r命令options(digits=8)
,该命令将为会话设置显示位数= 8。
然后,只需重新打印您的数据框,以查看默认情况下小数在屏幕上的显示方式已生效。
请咨询?options
,以获取有关数字显示设置和其他会话选项的更多信息。
编辑以改善原始答案并为将来的读者澄清:
options(digits=x)
不会不更改存储或读取到内部存储器中的浮点变量的值。 digits
会话选项仅更改浮点值 print 的方式,即根据'?options`文档:位数:控制打印数字值时要打印的有效位数。
如果在打印/显示的输出中看到的小数位数超出默认值(例如,对于数据框和数字变量),请尝试检查options()$digits
,并了解该选项只是用于以下内容的默认位数R的常见显示和打印方法。但是,它不会影响任何数据或变量上的浮点存储。
不过,关于浮点数,这里的另一个答案表明将option(digits=n)
设置为高于默认值可以如何帮助说明一些与浮点精度有关的精度/显示特性。这是OP在他的示例中显示的一个独立问题,但值得理解。
要对浮点精度进行更详细,更具体的讨论,而不是在此处重新讨论,那么值得阅读下面的权威性SO问题+答案:Why are these numbers not equal?
其他问题+答案+讨论特别涉及浮点精度问题,并且包含一长串精心呈现的参考文献,如果您需要有关该主题的更多信息,将会发现这很有用。
答案 2 :(得分:1)
如对OP的评论和其他答案中所述,此问题是由于在用于运行R的处理器上处理浮点数学的方式以及它与digits
选项的交互所引起的。
为说明起见,我们将使用OP中的数据创建一个Excel电子表格,并演示在调整options(digits=)
选项时会发生什么。
接下来,我们将编写一个简短的R脚本来说明调整digits
选项时发生的情况。
> # first, display the number of significant digits set in R
> getOption("digits")
[1] 7
>
> # Next, read data file from Excel
> library(xlsx)
>
> theData <- read.xlsx("./data/smallNumbers.xlsx",1,header=TRUE)
>
> head(theData)
Date X
1 2008-01-25 0.0023456
2 2008-12-23 0.0019870
>
> # change digits to larger number to replicate SO question
> options(digits=17)
> getOption("digits")
[1] 17
> head(theData)
Date X
1 2008-01-25 0.0023456000000000002
2 2008-12-23 0.0019870000000000001
>
但是,打印有效数字的行为因处理器/操作系统而异,因为在运行带有Microsoft Windows 10的Intel i7-6500U处理器的计算机上设置options(digits=16)
会导致以下结果:
> # what happens when we set digits = 16?
> options(digits=16)
> getOption("digits")
[1] 16
> head(theData)
Date X
1 2008-01-25 0.0023456
2 2008-12-23 0.0019870
>