Un tutorial breve sobre el uso de coerciones en R para trabajar con estructuras y tipos de datos
Acompañamos en iniciativas y proyectos de ciencia de datos, ingeniería e infraestructura. Visita nuestra página ixpantia y contáctanos.
Se estará preguntando ¿Qué es coerción? ¿Para qué necesito eso en R?
Pues resulta que R es un lenguaje con el que nos podemos comunicar con nuestra computadora pero necesitamos decirle ciertas cosas con suma claridad o como también se dice: explícitamente.
R cuando lee objetos como conjuntos de datos que importamos, automáticamente asume qué tipo de datos estamos importando, pero en algunas ocasiones puede ocurrir que esa suposición no sea correcta y muy probablemente se deba a que hay tipos de datos combinados.
Recordemos las estructuras en que se almacenan los datos en R. Tenemos -vectores -listas -data frame -matrices
La mayoría del tiempo vamos a estar trabajando con un data frame, que permite almacenar datos de diferentes tipos en su estructura. Pero más allá de esto un data frame se compone de columnas que deben de tener el mismo tipo de dato. Estas columnas son vectores y los vectores solamente permiten datos de un mismo tipo. Si mezclamos tipos de datos se van a coercionar según las reglas de R.
#TODO poner imagen de reglas de coercion que viene en el libro hands on programming
Revisemos que tipo son cada uno:
[1] "numeric"
[1] "character"
[1] "logical"
¿Porqué decimos que sólo pueden ser de un mismo tipo de dato?
Si mezclamos tipos de datos entre sí, ya sea numéricos con carácteres, lógicos con números o cualquier mezcla dentro de un vector, R va a coercionar (asumir) que los datos serán de un solo tipo.
Vamos a hacer varios ejemplos combinando tipos de datos dentro de un vector. Recordar que construimos un vector cuando ponemos un nombre y a este le asignamos (<-
) una serie de datos concatenados (c()
)
[1] "character"
¿Qué pasó? ¿No debería de ser numérico? Pues si bien la mayoría de datos en el vector son numéricos hay un “charatecr” allí dentro y por este es que ocurre la coerción. R entiende todos los datos que están dentro de prueba_vector
como character. De hecho, si imprimimos el contenido de prueba_vector
veremos que todos los datos están entre comillas.
[1] "20" "40" "A" "80"
Podemos experimentar con otros vectores en los que colocamos tipos de datos mezclados y observar qué sucede. ¿Cómo R coercionará los datos de diferentes tipos mezclados en vectores?
Como ejercicio mental, sin correr código en R, ¿Cuál será la clase de cada uno de los vectores de prueba que acabamos de generar?
Si ya los tiene, vamos a corrobar cómo R los coercionó:
[1] "numeric"
[1] "character"
[1] "integer"
[1] "character"
[1] "numeric"
R tiene formas para que nos comuniquemos con nuestra computadora, y dentro de estas instrucciones tenemos la función as.TIPO_DATO()
. En TIPO_DATO indicamos qué tipo de dato queremos que R entienda. Le hacemos explícita a R la coerción que deseamos.
Vamos a realizar esta coerción explícita con los vectores de prueba que creamos anteriormente.
[1] "numeric"
¿Qué cree que ha pasado con la letra que había inicialmente en el vector_prueba_1?
¿Qué ocurre con los datos de vector_prueba_2? ¿En qué se convierten?
¿Podríamos ahora sacar el promedio del vector_prueba_3?
Warning: NAs introduced by coercion
¿Qué ha pasado con vector_prueba_4?
¿Qué tenemos ahora con el vector_prueba_5?
El punto de haber repasado vectores y la coerción en vectores es que un dataframe se compone de vectores. Cada columna es un vector y además según los principios de tidy data en cada columna (variable) debemos de tener datos del mismo tipo. Así que si por alguna razón en una columna de un conjunto de datos que importamos tiene tipos de datos mezclados va a ocurrir la coerción que probablemente va a desembocar en algún error durante nuestro análisis.
Este blog lo mantiene el equipo de ixpantia y la comunidad de gente interesada en datos de la cual estamos contentos de formar parte ¿Tienes una idea para publicar algo aquí? ¡Escríbenos! Estamos siempre interesados en material e ideas nuevas. © 2019-2022 ixpantia