我正在尝试在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和openxlsx软件包直接从.xlsx文件尝试了其他导入方法:
> 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)。)