R中的科学记数法问题

Scientific notation issue in R

我有一个 20 位的 ID 变量。一旦我读取 R 中的数据,它就会变为科学记数法,然后如果我将相同的 id 写入 csv 文件,ID 的值就会发生变化。

例如,运行 下面的代码应该将 x 的值打印为“12345678912345678912”,但它打印出“12345678912345679872":

代码:

options(scipen=999)

x <- 12345678912345678912

打印(x)

输出:

[1] 12345678912345679872

我的问题是:

1) 为什么会这样?

2) 如何解决这个问题?

我知道它与 R 中数据类型的存储有关,但我仍然认为应该有一些方法来处理这个问题。我希望我对这个问题很清楚。

我不知道这个问题是否有人问过,所以请指点我 link 如果 duplicate.I 会删除这个 post

我已经完成了 this,所以我可以理解我的问题,但我无法解决它。

如有任何帮助,我们将不胜感激。谢谢

R 默认情况下不处理数值大于 2147483647L 的整数。

如果您将 L 附加到您的号码(告诉 R 它是 integer),您将得到:

x <- 12345678912345678912L
#Warning message:
#non-integer value 12345678912345678912L qualified with L; using numeric value 

这也解释了最后一位数字的变化,因为 R 将数字存储为 double

我认为 gmp-package 通常应该能够处理大量数据。因此,您应该接受精度损失,将它们存储为字符串,或者使用 gmp 包中的数据类型。

为了避免由于数字 storing/representation 引起的问题,您可以使用选项 colClasses 直接将 ID 变量作为字符导入,例如,如果使用 read.csv并导入带有 ÌD 列和另一个数字列的 data.frame:

mydata<-read.csv("file.csv",colClasses=c("character","numeric"),...)

使用readr你可以做到

mydata <- readr::read_csv("file.csv", col_types = list(ID=col_character()))

其中“ID”是您的 ID 列的名称