R在读取文件时添加了额外的数字

时间:2018-09-04 09:15:47

标签: r formatting decimalformat decimal-point

我一直试图读取一个包含日期字段和数字字段的文件。我将数据保存在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进行读取,但我再次遇到相同的问题。任何帮助将不胜感激!

3 个答案:

答案 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,以获取有关数字显示设置和其他会话选项的更多信息。

编辑以改善原始答案并为将来的读者澄清:

  1. 向上或向下更改options(digits=x)不会更改存储或读取到内部存储器中的浮点变量的值。 digits会话选项仅更改浮点值 print 的方式,即根据'?options`文档:
  2. 在常用打印功能的屏幕上显示:
  

位数:控制打印数字值时要打印的有效位数。

  1. OP所显示的问题(R在十进制数的最后一位数字后显示的小数比预期的OP多)不是由于从Excel中读取了源文件引起的-即给定OP具有CSV和TXT同样的问题,导入过程也没有问题。

如果在打印/显示的输出中看到的小数位数超出默认值(例如,对于数据框和数字变量),请尝试检查options()$digits,并了解该选项只是用于以下内容的默认位数R的常见显示和打印方法。但是,它不会影响任何数据或变量上的浮点存储。

不过,关于浮点数,这里的另一个答案表明将option(digits=n)设置为高于默认值可以如何帮助说明一些与浮点精度有关的精度/显示特性。这是OP在他的示例中显示的一个独立问题,但值得理解。

要对浮点精度进行更详细,更具体的讨论,而不是在此处重新讨论,那么值得阅读下面的权威性SO问题+答案:Why are these numbers not equal?
其他问题+答案+讨论特别涉及浮点精度问题,并且包含一长串精心呈现的参考文献,如果您需要有关该主题的更多信息,将会发现这很有用。

答案 2 :(得分:1)

如对OP的评论和其他答案中所述,此问题是由于在用于运行R的处理器上处理浮点数学的方式以及它与digits选项的交互所引起的。

为说明起见,我们将使用OP中的数据创建一个Excel电子表格,并演示在调整options(digits=)选项时会发生什么。

enter image description here

接下来,我们将编写一个简短的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
>