¿Cuál es la diferencia entre la clase entera y la clase numérica en R?

96

Quiero comenzar diciendo que soy un principiante absoluto en programación, así que disculpe lo básica que es esta pregunta.

Estoy tratando de comprender mejor las clases "atómicas" en R y tal vez esto se aplique a las clases de programación en general. Entiendo la diferencia entre clases de datos de carácter, lógicas y complejas, pero estoy luchando por encontrar la diferencia fundamental entre una clase numérica y una clase entera.

Digamos que tengo un vector simple x <- c(4, 5, 6, 6)de enteros, tendría sentido que fuera una clase de enteros. Pero cuando lo hago class(x)lo consigo [1] "numeric". Entonces, si convierto este vector en una clase entera x <- as.integer(x). Devuelve la misma lista exacta de números excepto que la clase es diferente.

Mi pregunta es por qué es este el caso y por qué la clase predeterminada para un conjunto de enteros es una clase numérica, y cuáles son las ventajas o desventajas de tener un conjunto de enteros como numérico en lugar de entero.

Keon
fuente
4
¿ as.integer(c(4.1, 5.2, 6.3, 6.4))Te ayuda a comprender la diferencia? Debe comprender que la representación interna y lo que se imprime no son lo mismo en absoluto. De todos modos, lea un poco sobre tipos de datos en lenguajes informáticos.
Roland
En la columna "Relacionados" a la derecha está esta pregunta: stackoverflow.com/questions/8804779/…
Matthew Lundberg
1
Pruébelo x <- 1; is.integer(x); is.numeric(x), entonces x <- 1L; is.integer(x); is.numeric(x)podrá ver un poco la diferencia. Las clases enteras se usan más para pasar variables de construcciones C y también en estructuras R. Sin embargo, hay mucho más en esto.
Rich Scriven
@Roland No pensé en clases que especificaran precisión. Estoy acostumbrado a usar métodos flotantes para manipular clases enteras. Que tiene sentido.
Keon

Respuestas:

87

Hay varias clases que se agrupan como clases "numéricas", las 2 más comunes de las cuales son dobles (para números de coma flotante de doble precisión) y enteras. R convertirá automáticamente entre las clases numéricas cuando sea necesario, por lo que, en su mayor parte, al usuario casual no le importa si el número 3 está actualmente almacenado como un entero o como un doble. La mayoría de las matemáticas se realizan con doble precisión, por lo que suele ser el almacenamiento predeterminado.

A veces, es posible que desee almacenar específicamente un vector como números enteros si sabe que nunca se convertirán en dobles (utilizados como valores de identificación o indexación), ya que los números enteros requieren menos espacio de almacenamiento. Pero si se van a usar en cualquier matemática que los convierta en dobles, entonces probablemente será más rápido almacenarlos como dobles para empezar.

Greg Snow
fuente
47

En primer lugar, es perfectamente factible utilizar R con éxito durante años y no es necesario conocer la respuesta a esta pregunta. R maneja las diferencias entre los números (habituales) y los enteros por usted en segundo plano.

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(Poner 'L' mayúscula después de un número entero obliga a que se almacene como un número entero).

Como puede ver, "integer" es un subconjunto de "numérico".

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

Los enteros solo llegan a un poco más de 2 mil millones, mientras que los otros números pueden ser mucho mayores. Pueden ser más grandes porque se almacenan como números de coma flotante de doble precisión. Esto significa que el número se almacena en dos partes: el exponente (como 308 arriba, excepto en base 2 en lugar de base 10), y el "significando" (como 1.797693 arriba).

Tenga en cuenta que 'is.integer' no es una prueba de si tiene un número entero, sino una prueba de cómo se almacenan los datos.

Una cosa a tener en cuenta es que el operador de dos puntos :, devolverá números enteros si los puntos inicial y final son números enteros. Por ejemplo, 1:5crea un integervector de números del 1 al 5. No es necesario agregar la letra L.

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

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

Rana Muhammad kashif
fuente
11
Tomado exactamente de la publicación de Quora, ¿verdad? ¡Podrías haber mencionado la referencia!
Srujan Barai
4
quora.com/…
Srujan Barai
4

Para citar la página de ayuda (prueba ?integer), la parte en negrita es mía:

Los vectores enteros existen para que los datos se puedan pasar al código C o Fortran que los espera, y para que los datos enteros (pequeños) se puedan representar de forma exacta y compacta .

Tenga en cuenta que las implementaciones actuales de R utilizan enteros de 32 bits para vectores enteros, por lo que el rango de enteros representables está restringido a aproximadamente +/- 2 * 10 ^ 9: los dobles pueden contener enteros mucho más grandes exactamente.

Como dice la página de ayuda, los R integerson números de 32 bits con signo, por lo que pueden contener entre -2147483648 y +2147483647 y ocupar 4 bytes.

R numerices idéntico a un 64 bits doubleconforme al estándar IEEE 754. R no tiene un solo tipo de datos de precisión. (fuente: páginas de ayuda de numericy double). Un doble puede almacenar todos los enteros entre -2 ^ 53 y 2 ^ 53 exactamente sin perder precisión.

Podemos ver los tamaños de los tipos de datos, incluida la sobrecarga de un vector ( fuente ):

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

Según tengo entendido, no declaramos una variable con un tipo de datos, por lo que, de forma predeterminada, R ha establecido cualquier número sin L como numérico. Si escribiste:

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

Ejemplo de entero:

> x<- 2L
> print(x)

Ejemplo de numérico (algo así como doble / flotante de otros lenguajes de programación)

> x<-3.4
> print(x)
Farah Nazifa
fuente
cuidado con un rango como 1:5creará números enteros.
qwr