Coerciones en R

Un tutorial breve sobre el uso de coerciones en R para trabajar con estructuras y tipos de datos

Ronny Hernández-Mora http://ronnyhdez.rbind.io/ (ixpantia)https://www.ixpantia.com
01-13-2020

Coerción

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.

¿Cuándo ocurre la coerción?

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"

¿Cómo evitar la coerción? ¿Cómo hacer explícita la coerción?

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?

¿Qué ha pasado con vector_prueba_4?

¿Qué tenemos ahora con el vector_prueba_5?

Todo esto es en vectores, ¿Porqué tengo que preocuparme si trabajo con dataframes?

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.

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY-NC 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".

Citation

For attribution, please cite this work as

Hernández-Mora (2020, Jan. 13). ixpantia blog: Coerciones en R. Retrieved from https://connect.ixpantia.com/ixblog/posts/2020-01-13-coerciones-en-r/

BibTeX citation

@misc{hernández-mora2020coerciones,
  author = {Hernández-Mora, Ronny},
  title = {ixpantia blog: Coerciones en R},
  url = {https://connect.ixpantia.com/ixblog/posts/2020-01-13-coerciones-en-r/},
  year = {2020}
}