R中的科学记数问题

时间:2015-01-13 09:59:15

标签: r

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

例如,运行以下代码应该会将x的值打印为" 12345678912345678912 ",但它会打印" 12345678912345679872 ":

代码:

options(scipen=999)

x <- 12345678912345678912

打印(x)的

输出:

[1] 12345678912345679872

我的问题是:

1)为什么会这样?

2)如何解决这个问题?

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

我不知道这个问题是否被提出,所以如果它是重复的话请指向我。我会删除这个帖子

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

任何帮助都将受到高度赞赏。感谢

3 个答案:

答案 0 :(得分:3)

默认情况下,R不会在数值上大于2147483647L处理整数。

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

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

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

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

答案 1 :(得分:1)

为避免因数字存储/表示而导致的问题,您可以使用选项IDcolClasses变量直接导入为字符,例如,如果使用read.csv并导入数据.frame包含ÌD列和另一个数字列:

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

答案 2 :(得分:1)

使用 readr 你可以做到

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

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