导入包含多个数字的(64位)整数时R中出现奇怪错误

导入包含多个数字的(64位)整数时R中出现奇怪错误,r,precision,digits,read.csv,R,Precision,Digits,Read.csv,我正在导入一个csv,它有一个包含很长整数的列(例如:2121020101132507598) a您不能简单地表示那么大的整数。看 .Machine 我盒子上的哪个有 $integer.max [1] 2147483647 32位有符号整数的最大值为2147483647。你的数字要大得多 请尝试将它们作为浮点值导入 在R或任何其他语言中处理浮点运算时,有几个注意事项需要注意: 正如其他人所指出的,不能表示那么大的整数。但R并不是将这些值读入整数,而是将它们读入双精度数字 双精度只能表示精

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


a您不能简单地表示那么大的整数。看

.Machine
我盒子上的哪个有

$integer.max
[1] 2147483647

32位有符号整数的最大值为2147483647。你的数字要大得多

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

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


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

双精度只能表示精确到16位的数字,这就是为什么数字在16位后舍入。有关潜在的解决方案,请参阅和软件包。虽然我在它们中都没有看到从文件读取的函数,但也许你可以通过查看它们的源代码来编造一些东西

更新: 以下是将文件放入
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)
#假设您的数字是文件中唯一的一列
#但是,请确保它们作为字符读入

aR的最大积分值约为2E9。正如@Joshua在另一个答案中提到的,一个潜在的解决方案是int64包

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

require(int64)

a这并不能解决问题。自己试试
a这是非常错误的,请删除或更正它。不能将这些64位整数表示为32位整数。所以你使用一个64位整数库。这不是R的工作原理,它只有32位整数,所以我的答案(仍然正确)。你希望得到64位整数并没有将它们添加到解释器/语言中。德克,这是不正确的,也是非常粗鲁的。R五年前就有了。R核心委员会是否已经齐心协力支持他们成为译员中的母语类型,这不是我们的问题。非限定术语“整数”不是“32位”的同义词-它可能意味着64位、128位等。看在上帝的份上,R!=R包。我知道(废弃的)
int64
和(未广泛使用的)
bit64
包,但它们并不能解决问题。您显然误解了R在内部的作用,您对其他语言/系统的引用(虽然在狭义上是正确的)根本不适用于该问题。您只是不理解R是如何实现的:
integer
在这里的确切含义是32位。让我的回答仍然正确,而你的否决票是粗鲁的。作为参考,这里也可以看到其他答案(有效地)说同样的话。现在你只需做
read.csv(…,colClasses=c('integer64',…)
,然后直接阅读即可。(确保设置选项('scipen'=99),这样它就不会以科学记数法呈现)值得提醒人们,和已经离开CRAN超过2年半了。
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