R에서 정수 클래스와 숫자 클래스의 차이점은 무엇입니까


96

나는 절대적인 프로그래밍 초보자라고 말하면서 이것을 시작하고 싶으므로이 질문이 얼마나 기본적인지 용서해주십시오.

나는 R의 "원자"클래스에 대해 더 잘 이해하려고 노력하고 있으며 아마도 이것은 일반적으로 프로그래밍 클래스에 해당 될 것입니다. 문자, 논리 및 복잡한 데이터 클래스의 차이점을 이해하지만 숫자 클래스와 정수 클래스의 근본적인 차이점을 찾기 위해 고군분투하고 있습니다.

간단한 x <- c(4, 5, 6, 6)정수 벡터가 있다고 가정 해 봅시다. 이것이 정수 클래스 인 것이 합리적입니다. 내가 할 때 class(x)내가 얻을 [1] "numeric". 그런 다음이 벡터를 정수 클래스로 변환합니다 x <- as.integer(x). 클래스가 다르다는 점을 제외하고는 동일한 숫자 목록을 반환합니다.

내 질문은 왜 이것이 사실이며, 정수 집합에 대한 기본 클래스가 숫자 클래스 인 이유와 정수 대신 숫자로 정수를 설정하는 것의 장점과 단점은 무엇인지입니다.


4
as.integer(c(4.1, 5.2, 6.3, 6.4))차이점을 이해하는 데 도움이 됩니까 ? 내부 표현과 인쇄되는 내용이 전혀 동일하지 않음을 이해해야합니다. 어쨌든 컴퓨터 언어의 데이터 유형에 대해 읽어보십시오.
Roland

오른쪽에있는 "관련"열에서이 질문은 다음과 같습니다 stackoverflow.com/questions/8804779/...
마태 복음 룬드

1
시도 x <- 1; is.integer(x); is.numeric(x)후, x <- 1L; is.integer(x); is.numeric(x)당신은 그 차이의 약간을 볼 수 있습니다. 정수 클래스는 C 구조와 R 구조에서 변수를 전달하는 데 더 많이 사용됩니다. 그러나 이것에 더 많은 것이 있습니다.
Rich Scriven

@Roland 나는 정밀도를 지정하는 클래스에 대해 생각하지 않았습니다. 정수 클래스를 조작하기 위해 float 메서드를 사용하는 데 익숙합니다. 말이 되는군요.
Keon 2014 년

답변:


87

"숫자"클래스로 함께 그룹화되는 여러 클래스가 있으며, 그중 가장 일반적인 2 개는 double (배정 밀도 부동 소수점 숫자의 경우) 및 정수입니다. R은 필요할 때 숫자 클래스간에 자동으로 변환하므로 대부분의 경우 숫자 3이 현재 정수로 저장되어 있는지 또는 두 배로 저장되어 있는지는 일반 사용자에게 중요하지 않습니다. 대부분의 수학은 배정 밀도를 사용하여 수행되므로 종종 기본 저장소가됩니다.

정수가 저장 공간을 덜 필요로하므로 벡터가 double로 변환되지 않을 것임을 알고있는 경우 (ID 값 또는 인덱싱으로 사용됨) 특별히 벡터를 정수로 저장할 수 있습니다. 그러나 그것들을 double로 변환하는 수학에서 사용한다면, 처음부터 double로 저장하는 것이 가장 빠를 것입니다.


47

먼저, R을 수년간 성공적으로 사용하는 것이 완벽하게 가능하며이 질문에 대한 답을 알 필요가 없습니다. R은 백그라운드에서 (일반적인) 숫자와 정수의 차이를 처리합니다.

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(정수 뒤에 대문자 'L'을 넣으면 정수로 저장됩니다.)

보시다시피 "integer"는 "numeric"의 하위 집합입니다.

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

정수는 20 억이 조금 넘지 만 다른 숫자는 훨씬 더 클 수 있습니다. 배정 밀도 부동 소수점 숫자로 저장되기 때문에 더 클 수 있습니다. 이것은 숫자가 두 부분으로 저장된다는 것을 의미합니다. 지수 (위의 308과 같고, 밑이 10이 아닌 2를 제외하고)와 "유효"(위의 1.797693과 같은)입니다.

'is.integer'는 정수가 있는지 여부를 테스트하는 것이 아니라 데이터가 저장되는 방식에 대한 테스트입니다.

주의해야 할 :점은 시작점과 끝 점이 정수인 경우 콜론 연산자 는 정수를 반환한다는 것입니다. 예를 들어, 1에서 5까지의 숫자로 1:5구성된 integer벡터를 만듭니다 L. 문자를 추가 할 필요가 없습니다 .

> class(1:5)
[1] "integer"

참조 : https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R


11
Quora 포스트에서 정확히 가져 왔습니다. 맞습니까? 방금 참조를 언급 할 수 있습니다!
Srujan Barai


4

도움말 페이지를 인용하려면 (try ?integer), 굵게 표시된 부분은 다음과 같습니다.

정수 벡터는 데이터를 예상하는 C 또는 Fortran 코드로 전달할 수 있도록 존재하므로 (작은) 정수 데이터를 정확하고 간결하게 표현할 수 있습니다 .

R의 현재 구현은 정수 벡터에 32 비트 정수를 사용하므로 표현 가능한 정수의 범위는 약 +/- 2 * 10 ^ 9로 제한됩니다. double은 훨씬 더 큰 정수를 정확하게 보유 할 수 있습니다.

도움말 페이지에서 알 수 있듯이 R integer은 부호가있는 32 비트 숫자이므로 -2147483648에서 +2147483647 사이를 유지하고 4 바이트를 차지할 수 있습니다.

R 은 IEEE 754 표준을 준수 numeric하는 64 비트와 동일합니다 double. R에는 단 정밀도 데이터 유형이 없습니다. (출처 : numeric및의 도움말 페이지 double). double은 정밀도를 잃지 않고 -2 ^ 53에서 2 ^ 53 사이의 모든 정수를 정확하게 저장할 수 있습니다.

벡터 ( source ) 의 오버 헤드를 포함한 데이터 유형 크기를 볼 수 있습니다 .

> object.size(1:1000)
4040 bytes
> object.size(as.numeric(1:1000))
8040 bytes

1

내 이해에-우리는 데이터 유형으로 변수를 선언하지 않으므로 기본적으로 R은 L이없는 숫자를 숫자로 설정했습니다. 당신이 쓴 경우 :

> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct

정수의 예 :

> x<- 2L
> print(x)

숫자의 예 (다른 프로그래밍 언어의 double / float와 유사)

> x<-3.4
> print(x)

1:5정수를 생성 하는 것과 같은 범위를 조심하십시오 .
qwr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.