我有一个20位数的ID变量。一旦我读取R中的数据,它就会变为科学记数法,然后如果我将相同的ID写入csv文件,则ID的值会发生变化。
例如,运行以下代码应该会将x的值打印为" 12345678912345678912 ",但它会打印" 12345678912345679872 ":
代码:
options(scipen=999)
x <- 12345678912345678912
打印(x)的
输出:
[1] 12345678912345679872
我的问题是:
1)为什么会这样?
2)如何解决这个问题?
我知道它与R中数据类型的存储有关,但我认为应该有一些方法来处理这个问题。我希望我对这个问题很清楚。
我不知道这个问题是否被提出,所以如果它是重复的话请指向我。我会删除这个帖子
我已经完成了this,所以我可以解决我的问题,但我无法修复它。
任何帮助都将受到高度赞赏。感谢
答案 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)
为避免因数字存储/表示而导致的问题,您可以使用选项ID
将colClasses
变量直接导入为字符,例如,如果使用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 列的名称