10 Anexo 2 - Otras funciones de Data Wrangling
Las herramientas del Data Wrangling del capítulo 2 son tan solo una introducción a las múltiples tareas que hay que realizar. Es imposible ser exhaustivo en las funciones que existen para cada una de las tareas, y con el tiempo van a tener que aprender a Googlear estas soluciones. Con todo, aquí van algunas funciones que son tan necesarias como las descriptas en el capítulo 2 y que las complementan.
10.1 Convirtiendo una variable númerica a categórica
En distintas ocasiones uno quiere convertir una variable númerica a una variable categórica. Las razones pueden ser variadas. Por ejemplo, un problema típico con los datos es que a veces se comparten con variables numéricas que representan una categoría ¿Los hace acordar a algo esto? Son los factor que R reconoce como una clase de vectores específica. Por momentos esto no trae muchos problemas, porque si sabemos qué significa cada código podemos hacer filtros y agrupar sin grandes dificultades.
El problema surge cuando usamos modelos de regresión o de árboles, que no tienen razón para saber que esa variable es categórica. Lo mismo sucede si quieren hacer gráficos. En esos casos debemos convertirla en factores. En rigor, ya vimos como hacer esto en otros capítulos de este libro. La diferencia aquí es que, además de reforzar el concepto, vamos a aprender a usar una función importante. Primero, voy a cargar los datos para los individuos de la Encuesta Permanente de Hogares (EPH) del corte del cuarto trimestre de 2018 (pueden encontrar estos datos en el Anexo I)
datos <- data.table::fread("datosIndividuos4t2018.csv")
Varias variables de este dataset son, en realidad, factores. Una de ellas es la variable REGION. Tidyverse (en realidad, uno de sus paquetes, dplyr) tiene una función que nos va a servir para usarla correctamente en modelos y gráficos: recode()
library(tidyverse)
datos <- datos %>%
mutate(REGION_CAT = recode(REGION, `1`="GBA",`40`="NOA",`41`="NEA",`42`="Cuyo",`43`="Pampeana",`44`="Patagónica"))
unique(datos$REGION)
## [1] 43 41 44 42 40 1
unique(datos$REGION_CAT)
## [1] "Pampeana" "NEA" "Patagónica" "Cuyo" "NOA" "GBA"
Como pueden ver en el ejemplo, recode() solo necesita que le pasemos el vector a modificar, y luego separado por coma todos los valores que hay que cambiar y luego, con un igual el valor que queremos que tome. Por ejemplo, el número 1 ahora será GBA y el 40, NOA. Noten que al tratarse de números en este caso tenemos que ponerles los siguientes signos ``. Si bien existen formas de solucionar esto, para mí el paquete plyr tiene una función que hace lo mismo pero un poco más simple (¡recuerden que para que esto funcione tienen que tener instalado plyr!)
datos <- datos %>%
mutate(REGION_CATPLYR = plyr::mapvalues(REGION,
from=c(1,40,41,42,43,44),
to=c("GBA","NOA","NEA","Cuyo","Pampeana","Patagónica")))
all(datos$REGION_CAT==datos$REGION_CATPLYR) # Mismo resultado
## [1] TRUE
La función mapvalue() pide los mismos datos que recode, pero en distinto formato. Solo tenemos que pasarle dos vectores: uno que tenga los valores que queremos convertir y otro a los valores que queremos convertirlos. Tienen que ser del mismo tamañao ya que va a fijarse en cada posición de asignarle el valor correspondiente en el otro valor. Así el valor 1 corresponde a GBA, 40 a NOA y así en adelante.
Ninguna de las dos funciones devuelve factores. No siempre necesitan que sean factores, pero en caso que sea necesario pueden usar la función ya vista en el cuerpo del libro:
datos <- datos %>%
mutate(REGION_CAT = factor(REGION_CAT))
unique(datos$REGION_CAT)
## [1] Pampeana NEA Patagónica Cuyo NOA GBA
## Levels: Cuyo GBA NEA NOA Pampeana Patagónica
En otras ocasiones queremos convertir a variables númericas a categorías, pero no con una correspondencia de “1 a 1”. Esto puede pasar, por ejemplo, con los ingresos. Imaginen que queremos separar a aquellos que ganan mas de 20.000 pesos de aquellos que ganan ese número o menos de ese valor en la ocupación principal (variable P21). Podemos usar una función que ya vimos varias veces en el libro: ifelse()
datos <- datos %>%
mutate(INGRESOS20K=ifelse(P21>20000,"Más de 20k","Menos de 20k"))
table(datos$INGRESOS20K)
##
## Más de 20k Menos de 20k
## 5729 51689
ifelse() solo nos pide que le pasemos una condición que va a fijarse si es verdadera o falsa (si el valor de P21 es mayor a 20000, en este caso). Si es verdadero, hará lo que ponemos inmediatamente después de la coma. Si es falso, hará lo que va después de la segunda coma, fácil ¿No?. Si quieren agregar más puntos de quiebre solo tienen que añidar los ifelse()
datos <- datos %>%
mutate(INGRESOSCAT=ifelse(P21>30000,"Más 30k",
ifelse(P21>20000,"Más de 20k","Menos de 20k")))