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.