我正在尝试在 R 中导入一些数据,但导入的数据与原始数据的不同之处在于较小的数字,我无法理解为什么。
首先,我尝试使用 read.csv 导入文件“test 1.csv”,其中包含一个数字:
1761,74956350536
但是导入的号码和原来的不一样:
> x <- read.csv2("test 1.csv", header = FALSE)
> print(x, digits = 20)
V1
1 1761.7495635053599017
我首先考虑 R 可能试图将数据读入一种不能容纳这么多数字的变量。但实际上,R 读取的数字比原来的数字“更精确”(位数更多)。它被正确读取为数字类型(因此是双精度浮点)。
然后我尝试将 x 写回另一个 .csv 文件:
> write.csv2(x, "test 1 out.csv", row.names = FALSE, col.names = FALSE)
结果是原始数字(1761,74956350536)被“恢复”了。
然后我认为这可能与打印功能的工作方式有关,并且 read.csv 读取的数字是正确的。然后,我在 Excel(测试 2.xlsx)中创建了一个电子表格,其中包含五个数字,第六列中这些数字的总和。然后将其导出为 .csv 文件。生成的文件(测试 2.csv)读取:
1761,749563505360000;2819,170384367300000;39,526631074886200;1600,629524205790000;0,556813868271186;6221,632917021610000
请注意,该系列的第一个数字与原始“test 1.csv”文件中包含的数字相同。然后我将它导入 R 并检查总和。
> x <- read.csv2("test 2.csv", header = FALSE)
> conf <- (sum(x[1:5])-x[6])
> conf
V6
1 -9.094947e-13
> print(conf, digits = 20)
V6
1 -9.0949470177292823792e-13
前五个数字不再加起来第六个。
我尝试了其他导入方法,直接从 .xlsx 文件,同时使用 xlsx 和 openxlsx 包:
> library(xlsx)
> x <- read.xlsx("test 2.xlsx", 1, header = FALSE)
> print(x[1], digits = 20)
X1
1 1761.7495635053587648
> conf <- (sum(x[1:5])-x[6])
> conf
X6
1 0
> print(conf, digits = 20)
X6
1 0
> write.xlsx(x, "test 2 out.xlsx", col.names=FALSE, row.names=FALSE)
和:
> library(openxlsx)
> x <- read.xlsx("test 2.xlsx", 1, colNames = FALSE)
> print(x[1], digits = 20)
X1
1 1761.7495635053587648
> conf <- (sum(x[1:5])-x[6])
> conf
X6
1 0
> print(conf, digits = 20)
X6
1 0
> write.xlsx(x, "test 2 out.xlsx", col.names=FALSE, row.names=FALSE)
现在我们仍然得到第三个数字,与原来的数字不同,也与 read.csv 读取的数字不同。再次 write.xlsx 将原始数字“恢复”为“test 2 out.xlsx”。在这种情况下,检查的总和匹配,但不幸的是,对于我目前正在处理的更大数字集的这些包和函数,情况并非如此。
我觉得我在问一些显而易见或众所周知的事情(我是新手......),因为操作非常简单。但我确实在这里不知所措。有谁知道为什么会这样?有没有办法避免/纠正/规避这种行为?任何帮助将不胜感激。
(我在 Linux Mint 17.1 Rebecca 机器上运行 R 版本 3.2.0(通过 RStudio)。)