2012-01-10 35 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包。