R que R

Data Wrangling: De factores, levels and labels

Fri, Jul 17, 2020
R Data Wrangling
#factors #factores #levels #labels #ordinals

Intro


Un factor es una estructura de datos que sirve para trabajar con variables categóricas, es decir, aquellas variables que toman una cantidad limitada o finita de variables o categorías. Uno de los ejemplos de variable categórica más utilizado es el que distingue entre hombre y mujer (alternativamente H, M), pero ejemplos de variables categóricas podemos encontrar infinitos y estará en función de la información sobre la que estemos trabajando. Tras esta pequeña anotación vayamos al tema y veamos cómo trabajar con estas estructuras en R:


Cómo trabajar con factores (factors) en R


En primer lugar vamos a crear un vector, que llamaremos vab_pc que, supongamos, haría referencia al nivel de renta per cápita de un conjunto de economías. Pongamos que establecemos 5 categorías para un conjunto de países según su renta por habitante. Las categorías serían: muy.baja, baja, media, alta, muy.alta y tendríamos, pongamos, diez observaciones o países:



vab_pc <- c("alta", "muy.baja", "baja", "baja", "media", "muy.baja", "alta", "muy.alta", "media", "alta")


El objeto creado (vab_pc) es de tipo character, tal y como nos indica al utilizar la función str() o la función class() (ver abajo). Dicho objeto contiene diez elementos [1:10]. Vemos, por tanto, que por el momento R no ha podido determinar que la información registrada sea de tipo factor.



str(vab_pc)
##  chr [1:10] "alta" "muy.baja" "baja" "baja" "media" "muy.baja" "alta" ...
class(vab_pc)
## [1] "character"


Para convertir el vector vab_pc en factor utilizaremos la función factor() de la siguiente forma:



vab_pc_fct <- factor(vab_pc)
vab_pc_fct
##  [1] alta     muy.baja baja     baja     media    muy.baja alta     muy.alta
##  [9] media    alta    
## Levels: alta baja media muy.alta muy.baja


Tras la operación realizada R ha convertido el objeto a factor (y ha eliminado las comillas de los elementos). Como vemos abajo, utilizando la función str(), el objeto creado tendría cinco levels: alta, baja, media, muy.alta, muy.baja.



str(vab_pc_fct)
##  Factor w/ 5 levels "alta","baja",..: 1 5 2 2 3 5 1 4 3 1


Y si representamos nuestro objeto gráficamente nos encontramos con el siguiente gráfico de barras:



plot(vab_pc_fct, col = "orange")


Levels:


Vemos que R ha ordenado las distintas categorías según un criterio alfabético y, por ello, a la categoría alta le atribuye el número 1, a baja el número 2, a media el número 3, etc. El orden asignado por defecto podría ser funcional en el caso de variables de tipo nominal pero, sin embargo, existe un gran número de ocasiones en las que trabajemos con variables ordinales, como es el caso que abordamos en este ejercicio, donde interesa especialmente que los factores mantengan un orden determinado (en nuestro caso será un rango desde muy bajo a muy alto). Para ordenar las categorías según un orden determinado utilizaremos el comando levels.



vab_pc_fct_levels <-  factor(vab_pc,
                              levels = c("muy.baja", "baja", "media", "alta", "muy.alta"))


Y examinamos de nuevo la estructura del nuevo objeto creado:



str(vab_pc_fct_levels)
##  Factor w/ 5 levels "muy.baja","baja",..: 4 1 2 2 3 1 4 5 3 4


El orden de los factores ha sido modificado. Ahora el valor 1 corresponde a muy.baja y evoluciona hasta el valor 5 para muy.alta. Podemos comprobar la modificación con la función levels() o, de nuevo, representar el resultado en un gráfico de barras:



levels(vab_pc_fct_levels)
## [1] "muy.baja" "baja"     "media"    "alta"     "muy.alta"



plot(vab_pc_fct_levels, col = "orange")


La función levels() permite también modificar el nombre de los niveles establecidos de forma muy sencilla. Es importante tener en cuenta que debemos mantener el orden en el que se encuentran las variables que queremos renombrar.



levels(vab_pc_fct_levels) <- c("MB", "B", "M", "A", "MA")


Veamos de nuevo los levels y la estructura del objeto modificado:



levels(vab_pc_fct_levels)
## [1] "MB" "B"  "M"  "A"  "MA"
str(vab_pc_fct_levels)
##  Factor w/ 5 levels "MB","B","M","A",..: 4 1 2 2 3 1 4 5 3 4



plot(vab_pc_fct_levels, col = "orange")


Labels:


Por su parte, el comando labels sirve para asignar nombres a las variables. Vamos a crear un nuevo objeto especificando los levels y los labels para dejar claro la diferencia entre ambas:



vab_pc_fct_levels_labels <-  factor(vab_pc,
                              levels = c("muy.baja", "baja", "media", "alta", "muy.alta"),
                              labels = c("nivel_muy_bajo", "nivel_bajo", "nivel_medio", "nivel_alto", "nivel_muy_alto"))


vab_pc_fct_levels_labels
##  [1] nivel_alto     nivel_muy_bajo nivel_bajo     nivel_bajo     nivel_medio   
##  [6] nivel_muy_bajo nivel_alto     nivel_muy_alto nivel_medio    nivel_alto    
## Levels: nivel_muy_bajo nivel_bajo nivel_medio nivel_alto nivel_muy_alto
str(vab_pc_fct_levels_labels)
##  Factor w/ 5 levels "nivel_muy_bajo",..: 4 1 2 2 3 1 4 5 3 4



plot(vab_pc_fct_levels_labels, col = "orange")


Levels ordenados con ordered = TRUE:


Para indicar que la variable creada es de tipo ordinal y que, por tanto, existe un orden determinado para las distintas categorías, utilizamos el comando ordered = TRUE.



vab_pc_fct_ord <-  factor(vab_pc, ordered = TRUE,
                              levels = c("muy.baja", "baja", "media", "alta", "muy.alta"))


Vemos abajo que R especifica la nueva condición con el signo <. Gráficamente el resultado será igual al realizado previamente de forma manual.



vab_pc_fct_ord
##  [1] alta     muy.baja baja     baja     media    muy.baja alta     muy.alta
##  [9] media    alta    
## Levels: muy.baja < baja < media < alta < muy.alta



plot(vab_pc_fct_ord, col = "orange")


Eso es todo por ahora. Espero que le haya servido de ayuda.