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.
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.x <- 1; is.integer(x); is.numeric(x)
, entoncesx <- 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.Respuestas:
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.
fuente
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:5
crea uninteger
vector de números del 1 al 5. No es necesario agregar la letraL
.> class(1:5) [1] "integer"
Referencia: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R
fuente
Para citar la página de ayuda (prueba
?integer
), la parte en negrita es mía:Como dice la página de ayuda, los R
integer
son números de 32 bits con signo, por lo que pueden contener entre -2147483648 y +2147483647 y ocupar 4 bytes.R
numeric
es idéntico a un 64 bitsdouble
conforme al estándar IEEE 754. R no tiene un solo tipo de datos de precisión. (fuente: páginas de ayuda denumeric
ydouble
). 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
fuente
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)
fuente
1:5
creará números enteros.