2012-01-10 3 views
24

나는 약간의 계산이 진행 다음과 같은 경고 (즉,없는 오류)를 얻을 수있다 :이 thread명에서R에서 정수 오버플로 란 무엇이며 어떻게 될 수 있습니까?

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

는 정수가 발생하지 않는 단순히 오버 플로우 상태. R은 지나치게 현대적이 아니거나 올바르지 않습니다. 그러나 내가 여기서해야 할 일은 무엇일까요? 경고 메시지에 as.numeric을 사용하면 정보가 이전에 손실되었다는 사실을 설명하지 못할 수도 있습니다. myvar은 .csv 파일 형식이므로, 더 큰 필드가 필요하다는 것을 R이 알아 내면 안됩니까? 벌써 뭔가 끊어 버린거야?

integer 또는 numeric의 최대 길이는 얼마입니까? 다른 필드 유형/모드를 제안 하시겠습니까?

편집 : 나는 실행

R 버전 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으로 설정됩니다.

파일에서 큰 값을 읽을 때 character-class를 대상으로 사용하고 조작하는 것이 더 안전합니다. NA 값에 강요가있는 경우 경고가 표시됩니다.

+0

+1 Rmpfr 패키지! –

+0

'gmp' 패키지도 관심의 대상이 될 수 있습니다 – James

+0

나는 0,1과 NA로 채워진 data.table과 함께 DT [, sapply (.SD, sum, na.rm = T)]를 2 백만 행. 오버플로 메시지가 표시되지만 생성되는 최대 수는 2 백만 미만이어야합니다. 무슨 일이 일어날 수 있니? – skan

17

에서 short, integer은 제한된 범위의 정확한 유형이고 numeric은 훨씬 더 넓은 범위의 값을 나타낼 수 있지만 정확하지 않은 부동 소수점 유형입니다. 자세한 내용은 도움말 페이지 (?integer?numeric)를 참조하십시오. 그것은 당신이 평균을 복용하는 것을 의미

[귀하의 경우, 합 - @aix 일부 매우 큰 정수의 : 오버 플로우에 관해서는

, 여기에 브라이언 D. 리플리에 의해 explanation입니다 , 그리고 계산이 오버플로됩니다. 그것은 단지 경고 일뿐입니다. 이것은 R.의 다음 릴리스에서 일어나지 않을 것입니다

당신은 수 1 반대로, 예를 들어, 1L는 정수이다, 그것을 접미사 L를 제공함으로써 정수 지정할 수 있습니다 클래스 "numeric" 인 부동 소수점 1입니다.

컴퓨터에서 만들 수있는 가장 큰 정수는 .Machine$integer.max입니다. 이것에 양의 정수를 추가

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

NA를 반환, 오버 플로우가 발생합니다.

대신에 부동 소수점 값을 추가하여이 제한을 반올림 할 수 있습니다. 귀하의 경우 경고가 sum 발행되기 때문에

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

,이 숫자가 함께 추가 될 때 오버 플로우가 발생했음을 나타냅니다. 제안 된 해결 방법 sum(as.numeric(.))이 트릭을 수행해야합니다.

+1

좋아요, 정확한 계산을하고 큰 숫자를 원한다면 어떻게해야합니까?정확하게 숫자가 추가되면 오버플로가 생성됩니다. 정확하게 결과를 얻을 수 있습니까? –

+0

가장 큰 정수에 숫자를 추가 할 때 일어나는 일에 대한 설명을 수정했습니다. –

+0

...하지만 이것을 시도해보십시오 :'class (sum (c) (.Machine $ integer.max, as.integer (1)))') 나는 2.14를 사용하여 정수 오버 플로우를 얻는다. – Dason

4

정수 또는 숫자의 최대 길이는 얼마입니까?

벡터는 현재 정수로 인덱싱되므로 최대 길이는 .Machine$integer.max입니다. DWin이 언급했듯이 모든 R 버전은 현재 32 비트 정수를 사용하므로 2^31 - 1이거나 20 억을 약간 넘게됩니다.

심각한 하드웨어를 포장하지 않는 한 (또는 장래에 이것을 읽으려는 사람이 아닌 경우 2012 년에도 도움을 받으십시오) 길면 벡터를 할당 할만큼 충분한 메모리가 없을 것입니다.

나는 R-core (Brian Ripley, 나는 생각한다)가 다음 단계가 두 배의 가수 또는 그와 같은 영리한 것으로 색인을 생성하여 효과적으로 48 비트의 색인을 제공 할 수 있다고 제안한 것을 기억한다. 슬프게도, 나는 그 토론을 찾을 수 없다. 당신은 정수 오버 플로우를 겪고있는 경우


Rmpfr 패키지 외에도, 당신은 int64 패키지를 시도 할 수 있습니다.

관련 문제