Qual é a diferença entre classe inteira e classe numérica em R

93

Quero começar dizendo que sou totalmente iniciante em programação, então, desculpe o quão básica é essa pergunta.

Estou tentando obter um melhor entendimento das classes "atômicas" em R e talvez isso se aplique às classes de programação em geral. Eu entendo a diferença entre um caractere, classes de dados lógicos e complexos, mas estou lutando para encontrar a diferença fundamental entre uma classe numérica e uma classe de inteiro.

Digamos que eu tenha um vetor simples x <- c(4, 5, 6, 6)de inteiros, faria sentido que fosse uma classe de inteiros. Mas quando eu faço, class(x)eu consigo [1] "numeric". Então, se eu converter esse vetor em uma classe de inteiros x <- as.integer(x). Ele retorna a mesma lista exata de números, exceto pela classe ser diferente.

Minha pergunta é por que esse é o caso e por que a classe padrão para um conjunto de inteiros é uma classe numérica e quais são as vantagens e / ou desvantagens de ter um conjunto inteiro como numérico em vez de inteiro.

Keon
fonte
4
Será que as.integer(c(4.1, 5.2, 6.3, 6.4))ajudá-lo a compreender a diferença? Você precisa entender que a representação interna e o que é impresso não são iguais. De qualquer forma, leia um pouco sobre os tipos de dados em linguagens de computador.
Roland
Na coluna "Relacionado" à direita está esta pergunta: stackoverflow.com/questions/8804779/…
Matthew Lundberg
1
Experimente x <- 1; is.integer(x); is.numeric(x), então, x <- 1L; is.integer(x); is.numeric(x)e você verá um pouco da diferença. Classes inteiras são mais usadas para passar variáveis ​​de construções C e também em estruturas R. Porém, há muito mais nisso.
Rich Scriven
@Roland Eu não pensei em classes especificando precisão. Estou acostumado a usar métodos float para manipular classes de inteiros. Faz sentido.
Keon de

Respostas:

82

Existem várias classes que são agrupadas como classes "numéricas", as 2 mais comuns das quais são duplas (para números de ponto flutuante de precisão dupla) e inteiras. R irá converter automaticamente entre as classes numéricas quando necessário, portanto, na maioria das vezes, não importa para o usuário casual se o número 3 está armazenado atualmente como um inteiro ou duplo. A maior parte da matemática é feita com precisão dupla, de modo que geralmente é o armazenamento padrão.

Às vezes, você pode querer armazenar especificamente um vetor como inteiros se souber que eles nunca serão convertidos em duplos (usados ​​como valores de ID ou indexação), pois os inteiros requerem menos espaço de armazenamento. Mas se eles forem usados ​​em qualquer matemática que os converterá em duplos, então provavelmente será mais rápido armazená-los apenas como duplos para começar.

Greg Snow
fonte
45

Em primeiro lugar, é perfeitamente viável usar R com sucesso por anos e não precisar saber a resposta para essa pergunta. R trata das diferenças entre os números (usuais) e os inteiros para você em segundo plano.

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(Colocar 'L' maiúsculo após um inteiro força-o a ser armazenado como um inteiro.)

Como você pode ver, "inteiro" é um subconjunto de "numérico".

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

Os inteiros vão para um pouco mais de 2 bilhões, enquanto os outros números podem ser muito maiores. Eles podem ser maiores porque são armazenados como números de ponto flutuante de precisão dupla. Isso significa que o número é armazenado em duas partes: o expoente (como 308 acima, exceto na base 2 em vez da base 10) e o "significando" (como 1.797693 acima).

Observe que 'is.integer' não é um teste para saber se você tem um número inteiro, mas um teste de como os dados são armazenados.

Uma coisa a ser observada é que o operador de dois pontos,, :retornará inteiros se os pontos inicial e final forem números inteiros. Por exemplo, 1:5cria um integervetor de números de 1 a 5. Você não precisa anexar a letra L.

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

Referência: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R

Rana Muhammad Kashif
fonte
11
Tirado exatamente da postagem do Quora, certo? Você poderia apenas ter mencionado a referência!
Srujan Barai,
4
quora.com/…
Srujan Barai
4

Para citar a página de ajuda (tente ?integer), minha parte em negrito:

Vetores inteiros existem para que os dados possam ser passados ​​para o código C ou Fortran que os espera, e para que (pequenos) dados inteiros possam ser representados de forma exata e compacta .

Observe que as implementações atuais de R usam inteiros de 32 bits para vetores de inteiros, portanto, o intervalo de inteiros representáveis ​​é restrito a cerca de +/- 2 * 10 ^ 9: duplos podem conter inteiros muito maiores exatamente.

Como diz a página de ajuda, os Rs integersão números de 32 bits com sinal, portanto, podem conter entre -2147483648 e +2147483647 e ocupar 4 bytes.

R's numericé idêntico a um 64 bits em doubleconformidade com o padrão IEEE 754. R não possui um único tipo de dados de precisão. (fonte: páginas de ajuda denumeric e double). Um double pode armazenar todos os inteiros entre -2 ^ 53 e 2 ^ 53 exatamente sem perder a precisão.

Podemos ver os tamanhos dos tipos de dados, incluindo a sobrecarga de um vetor ( fonte ):

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

No meu entendimento - não declaramos uma variável com um tipo de dados, portanto, por padrão, R definiu qualquer número sem L como numérico. Se você escreveu:

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

Exemplo de inteiro:

> x<- 2L
> print(x)

Exemplo de numérico (tipo double / float de outras linguagens de programação)

> x<-3.4
> print(x)
Farah Nazifa
fonte
observe um intervalo como 1:5criará inteiros.
qwr