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

R is adding extra numbers while reading file

我一直在尝试读取一个包含日期字段和数字字段的文件。我的数据在 excel sheet 中,看起来像下面这样 -

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

我已经尝试使用诸如 round、format (nsmall = 7) 等函数来限制数字,但似乎没有任何效果。我究竟做错了什么?我还尝试将数据保存为 csv 和 txt,并使用 read.csv 和 read.delim 读取它,但我再次遇到同样的问题。任何帮助将不胜感激!

library(formattable)

x <- formattable(x, digits = 7, format = "f")

或者您可能希望添加此内容以从 R:

获取默认格式
options(defaultPackages = "")

然后,重启你的 R。

也许问题不在于您所说的源文件,因为 .csv 和 .txt 也会出现这种情况。

尝试通过 运行 options()$digits

检查显示数字选项的当前值

如果结果是14 那么这可能是问题所在。

在这种情况下,请尝试 运行 r 命令 options(digits=8),这将为会话设置显示数字 = 8。

然后,只需重新打印您的数据框,就可以看到有关默认情况下小数在屏幕上的显示方式的更改已经生效。

有关数字显示设置和其他会话选项的更多信息,请参阅 ?options

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

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

digits: controls the number of significant digits to print when printing numeric values.

  1. OP 显示他遇到的问题(R 在十进制数的最后一位后显示的小数比 OP 预期看到的多)不是由从 Excel 读取的源文件引起的- 即考虑到 OP 在 CSV 和 TXT 方面有同样的问题,导入过程没有造成问题。

如果您在 printed/displayed 输出中看到的小数比默认情况下多(例如,对于数据帧和数字变量),请尝试检查 options()$digits 并了解该选项只是数字的默认值R 的常用显示和打印方法使用的数字。但是,它不会影响任何数据或变量的浮点存储。

不过,关于浮点数,此处的另一个答案显示了将 option(digits=n) 设置为高于默认值如何帮助展示一些与浮点精度相关的 precision/display 特质。这与 OP 在他的示例中显示的内容不同,但非常值得理解。

对于浮点精度的更详细和特定主题的讨论,而不是在这里重新散列,非常值得阅读这个权威的 SO 问题+答案:Why are these numbers not equal?
另一个问题+答案+讨论涵盖了具体与浮点精度相关的问题,并包含一长串精心呈现的参考资料列表,如果您需要有关该主题的更多信息,您会发现这些资料很有帮助。

正如对 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
>

但是,打印有效数字的行为因处理器/操作系统而异,因为设置 options(digits=16) 会导致计算机 运行 将 Intel i7-6500U 处理器与 Microsoft Windows10:

> # 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
>