2012-01-10 107 views
24

我有一些计算怎么回事,得到下面的警告(即不是一个错误):R中的整数溢出是什么?它是怎么发生的?

Warning messages: 
1: In sum(myvar, na.rm = T) : 
Integer overflow - use sum(as.numeric(.)) 

在这种thread人指出,整数溢出根本就不会发生。 R不是过于现代化,或者他们是不正确的。但是,我应该在这里做什么?如果我使用as.numeric作为警告建议,我可能不会说明信息丢失的情况。 myvar从一个.csv文件读取,所以不应该找出一些更大的字段是必要的?它已经切断了什么吗?

什么的integernumeric的最大长度是多少?你会建议任何其他字段类型/模式吗?

编辑:我运行:

ř版本2.13.2(2011-09-30) 平台:x86_64的-苹果darwin9.8.0/x86_64的(64位)R Studio中

回答

35

你可以通过阅读帮助页面?integer回答许多您的问题。它说:

R使用对于整数向量32位整数,因此可表示 整数的范围被限制为约+/- 2 * 10^9。

R核心正在考虑扩大为大整数,但这不会在不久的将来发生。

如果您想要一个“bignum”容量,然后安装Martin Maechler的Rmpfr package [PDF]。由于作者的声望,我推荐'Rmpfr'软件包。 Martin Maechler也深入参与了Matrix软件包开发,并且也参与了R Core。还有其他选择,包括诸如'gmp','Brobdingnag'和'Ryacas'包等算术软件包(后者还提供了一个符号数学界面)。

接下来,要回答您关联的答案中的关键评论以及如何评估与您的工作的相关性,请考虑以下事项:如果在那些“现代”语言之一中具有相同的统计功能在R中,您可能会看到用户正在朝这个方向迁移。但我想说的是,移民,当然还有增长,目前正处于R方向。统计人员为统计建立了R。

曾经有一个带有统计软件包Xlisp-Stat的Lisp变种,但它的主要开发者和支持者现在是R-Core的成员。另一方面,最早的R开发者之一Ross Ihaka,suggests working toward development in a Lisp-like language [PDF]。有一种名为Clojure的编译语言(发音为英语人士会说“关闭”),并带有实验界面Rincanter。

更新:

R(3.0 +)的新版本的具有排序(使用numeric尾数)的53个整数。当一个“整数”向量元素被分配一个超过'.Machine $ integer.max'的值时,整个向量被强制为“数字”,也就是“double”。 integers的最大值仍然保持原样,但是,在以前会产生溢出的情况下,可能会强制整数向量加倍以保持精度。不幸的是,列表的长度,矩阵和数组维度以及向量的长度仍然设置为integer.max

从文件中读取较大的值时,使用字符类作为目标然后进行操作可能更安全。如果对NA值进行强制处理,则会有警告。

+0

为Rmpfr包+1! – 2012-01-10 14:49:24

+0

'gmp'包也许是有趣的 – James 2012-01-10 16:33:17

+0

我正在做一个DT [,sapply(.SD,sum,na.rm = T)],其中data.table填充了0,1和NA,其中200万行。我得到溢出消息,但生成的最大数量应该少于200万。会发生什么? – skan 2017-01-28 00:29:39

17

在短,integer是一种精确类型具有有限范围,并且numeric是一个浮点类型可以表示范围更广的值,但是不精确的。详情参见帮助页面(?integer?numeric)。

至于溢出,这里是一个explanation由Brian D.雷普利:

这意味着,你正在服用的平均值[你的情况,总和 - @aix]一些非常大的整数,并且 计算溢出。这只是一个警告。

这不会在河的下一个版本发生

您可以指定一个数字是通过赋予后缀L,例如,1L是一个整数,而不是1整数这是一个浮点数,类"numeric"

,你可以在你的机器上创建的最大整数由.Machine$integer.max给出。

> .Machine$integer.max 
[1] 2147483647 
> class(.Machine$integer.max) 
[1] "integer" 

添加到这一个正整数引起溢出,返回NA

> .Machine$integer.max + 1L 
[1] NA 
Warning message: 
In .Machine$integer.max + 1L : NAs produced by integer overflow 
> class(.Machine$integer.max + 1L) 
[1] "integer" 

您可以通过添加浮点值来取代该限制。

> .Machine$integer.max + 1 
[1] 2147483648 
> class(.Machine$integer.max + 1) 
[1] "numeric" 

因为你的情况的警告是由sum发出,这表明当数加在一起溢出发生。建议的解决方法sum(as.numeric(.))应该做的伎俩。

+1

好的,如果我想要精确计算并有大数字,该怎么办?确切地说,当添加数字时会产生溢出。无论如何,我可以有确切的结果吗? – 2012-01-10 14:47:00

+0

我已经修复了将数字添加到最大整数时发生的情况的描述。 – 2012-01-10 17:38:32

+0

...但试试这个:class(s​​um(c(.Machine $ integer.max,as.integer(1))))'我得到一个整数溢出(使用2.14)。 – Dason 2012-01-10 17:40:05

4

什么是整数或数字的最大长度?

载体当前与的整数索引,所以最大长度由.Machine$integer.max给出。正如DWin指出的那样,R的所有版本都使用32位整数,因此这将是2^31 - 1,或者略多于20亿。

除非你正在打包一些严重的硬件(或者你将来正在阅读这本书; 2012年的你好),否则你将没有足够的内存来分配很长的载体。

我记得R-core(Brian Ripley,我认为)建议下一步可以用双数尾数索引向量,或者像这样聪明的事情,有效地给出48位索引。可悲的是,我找不到那个讨论。


除了Rmpfr包,如果你正在遭受整数溢出,你可能想尝试的int64包。