8

我正在导入一个 csv,它有一列包含很长的整数(例如:2121020101132507598)

a<-read.csv('temp.csv',as.is=T)

当我将这些整数作为字符串导入时,它们会正确通过,但是当作为整数导入时,最后几位数字会发生变化。我不知道发生了什么...

1 "4031320121153001444" 4031320121153001472
2 "4113020071082679601" 4113020071082679808
3 "4073020091116779570" 4073020091116779520
4 "2081720101128577687" 2081720101128577792
5 "4041720081087539887" 4041720081087539712
6 "4011120071074301496" 4011120071074301440
7 "4021520051054304372" 4021520051054304256
8 "4082520061068996911" 4082520061068997120
9 "4082620101129165548" 4082620101129165312

4

4 回答 4

11

正如其他人所指出的,您不能表示那么大的整数。但是 R 并没有将这些值读入整数,而是将它们读入双精度数字。

双精度只能准确地将数字表示到 ~16 位,这就是为什么您看到数字在 16 位后四舍五入的原因。有关可能的解决方案,请参阅gmpRmpfrint64包。虽然我在其中的任何一个中都没有看到从文件中读取的功能,但也许您可以通过查看它们的来源来制作一些东西。

更新:这是将文件放入int64对象的方法:

# This assumes your numbers are the only column in the file
# Read them in however, just ensure they're read in as character
a <- scan("temp.csv", what="")
ia <- as.int64(a)
于 2012-07-11T21:02:06.650 回答
7

R 的最大整数值约为 2E9。正如@Joshua 在另一个答案中提到的那样,一个潜在的解决方案是 int64 包。

而是将值作为字符导入。然后转换为类型int64

require(int64)
a <- read.csv('temp.csv', colClasses = 'character', header=FALSE)[[1]]
a <- as.int64(a)
print(a)
[1] 4031320121153001444 4113020071082679601 4073020091116779570
[4] 2081720101128577687 4041720081087539887 4011120071074301496
[7] 4021520051054304372 4082520061068996911 4082620101129165548
于 2012-07-11T21:13:16.847 回答
4

您根本无法表示那么大的整数。看

.Machine

我的盒子上有

$integer.max
[1] 2147483647
于 2012-07-11T20:35:52.757 回答
3

32 位有符号整数的最大值为 2,147,483,647。你的数字要大得多。

尝试将它们作为浮点值导入。

在 R 或任何其他语言中处理浮点运算时,有一些注意事项需要注意:

http://blog.revolutionanalytics.com/2009/11/floatingpoint-errors-explained.html

http://blog.revolutionanalytics.com/2009/03/when-is-a-zero-not-a-zero.html

http://floating-point-gui.de/basic/

于 2012-07-11T20:37:35.253 回答