Estructuras de datos en R: Factores


Rosa Molina

Esta entrada es parte de la serie de Estructuras de datos en R. Veremos qué son, cómo funcionan y para qué sirven los factores. También revisaremos cómo editarlos una vez que ya fueron creados y cómo acceder a la información que guardan.

Si realizas, o quieres realizar análisis de datos en R, esta entrada será de mucha ayuda. Vamos allá.


ADVERTISEMENT



Los factores son estructuras de datos similares a los vectores. La diferencia radica en que los factores sólo pueden tener un número limitado de valores posibles.

Esto es útil cuando se trabaja con categorías discretas, como variables nominales y ordinales. Vamos a ver cómo se define un factor en R, con ejemplos de estos tipos de variables:

#Ejemplo de variable categórica nominal
musica <- factor(c("rock", "pop", "rock", "jazz", "pop"))
musica
[1] rock pop rock jazz pop
Levels: jazz pop rock

Un factor se define con la función factor(). El primer argumento de esta función es un vector (en este caso, el vector está definido dentro del factor).

R reconoce que el vector, en nuestro ejemplo, tiene cinco elementos ("rock", "pop", "rock", "jazz" y "pop"), pero también reconoce los valores únicos, llamados Levels ("jazz", "pop" y "rock", en orden alfabético) y los almacena junto con el vector, dentro de la variable llamada "musica". Ahora, no puede haber un elemento dentro del vector que no se llame "jazz", "pop" o "rock".

Ahora veamos un ejemplo de variable ordinal:

#Para especificar categorías ordinales se usa el argumento "ordered"
talla <- factor(c("chico", "chico", "mediano", "grande"), ordered = TRUE)
talla
[1] chico chico mediano grande
Levels: chico < grande < mediano

¿Qué sucedió? R reconoció nuestro vector y que sus categorías debían estar ordenadas, pero el orden no resultó como esperábamos. Esto es porque R almacena las categorías en orden alfabético, pero podemos especificar el orden que queramos con el argumento levels. Intentemos:

#El argumento "levels" requiere un vector, con el orden correcto
talla <- factor(c("chico", "chico", "mediano", "grande"),
                   levels = c("chico", "mediano", "grande"),
                   ordered = TRUE)
talla
[1] chico chico mediano grande
Levels: chico < mediano < grande

Esto que hemos visto es de suma importancia, ya que de esta forma, R sabrá que se trata de categorías nominales u ordinales a la hora de hacer, por ejemplo, análisis estadísticos.

Accediendo y editando las categorías de un factor

Para saber cuáles son las categorías dentro de un factor se usa la función levels(). Y para saber cuántas categorías tiene un factor se usa la función nlevels(). Veamos unos ejemplos:

levels(musica)
nlevels(musica)
[1] "jazz" "pop" "rock"
[1] 3

Dentro de nuestro factor "musica" sólo puede haber valores que sean "jazz", "pop" o "rock". Pero si queremos tener más categorías, podemos añadirlas:

levels(musica) <- c(levels(musica), "metal")
levels(musica)

musica
[1] "jazz" "pop" "rock" "metal"

[1] rock pop rock jazz pop
Levels: jazz pop rock metal

Vamos a ver por partes cómo fue que lo hicimos. La salida de levels(musica) es un vector que contiene las categorías. Como a cualquier vector, le podemos añadir valores, en este caso el valor "metal".

En esencia, nuestro factor contiene los mismos elementos, sólo añadimos una posible categoría ("metal"), que en este momento, no está en uso.

Y ahora, ¿cómo eliminamos categorías en desuso? Esto requiere de la función droplevels(). Esta función eliminará todas las categorías que no estén representadas (como nuestra categoría "metal"). Probemos:

musica <- droplevels(musica)
musica
[1] rock pop rock jazz pop
Levels: jazz pop rock

Accediendo a los elementos de un factor

Acceder a los elementos de un factor es muy similar a como funciona con los vectores.

#Aceder al elemento 4
musica[4]
#Acceder a todos los elementos menos el 2
musica[-2]
#Acceder a los elementos 1 y 4
musica[c(1,4)]
#Acceder a todos los elementos menos el 1 y el 3
musica[c(-1,-3)]

#Acceder a todos los elementos de la categoría "pop"
musica[musica == "pop"]
#Acceder a todos los elementos que sean de las categorías "pop" o "jazz"
musica[musica == "pop" | musica == "jazz"]
[1] jazz
Levels: jazz pop rock

[1] rock rock jazz pop
Levels: jazz pop rock

[1] rock jazz
Levels: jazz pop rock

[1] pop jazz pop
Levels: jazz pop rock

[1] pop pop
Levels: jazz pop rock

[1] pop jazz pop
Levels: jazz pop rock

El operador "|" representa la expresión lógica de disyunción. En nuestro ejemplo anterior se refiere a: "La música que es jazz o pop".

Editando los elementos de un factor

Los elementos de un factor se editan primero accediendo a ellos, y luego asignándoles un nuevo valor. Digamos que ahora somos puro jazz y queremos que los elementos "rock" y "pop" sean de esta categoría. Lo podemos hacer de varias maneras:

#Las siguientes líneas tendrán el mismo resultado
musica[c(1,2,3,4)] <- "jazz"
musica[-5] <- "jazz"
musica[musica == "rock" | musica == "pop"] <- "jazz"
[1] jazz jazz jazz jazz jazz
Levels: jazz pop rock

Importante
Al editar los elementos de un factor, sólo puedes asignar un valor que esté dentro de las categorías del factor.

Renombrando una categoría

En este momento, nuestro vector música está lleno de jazz. Ahora digamos que empezamos a conocer más y nos damos cuenta que nos gusta solamente el "big band". ¿Cómo cambiamos el nombre de la categoría junto con todos los elementos? Con lo que hemos aprendido hasta ahora lo podemos lograr:

#Paso 1: Asignarle a la categoría "jazz" el valor de "big band"
levels(musica)[levels(musica)=="jazz"] <- "big band"
#Esto hará que los elementos que sean "jazz" ahora sean "big band"

#Paso 2: Eliminar las categorías sin utilizar
musica <- droplevels(musica)

Funciones sobre factores

Regresemos a nuestro factor "talla" y probemos en él algunas funciones útiles:

#La función class() nos dirá de qué tipo de estructura de datos se trata
class(talla)
#La función str() nos dirá cómo está organizado nuestro objeto
str(talla)
#La función length() nos dirá cuántos elementos hay en nuestro objeto
length(talla)

#La función summary() nos hará un resumen de nuestro objeto
summary(talla)
[1] factor
Ord.factor w/ 3 levels "chico"<"mediano"<..: 1 1 2 3 3
[1] 5

chico mediano grande
    2       1      2

En este caso, la función summary() nos dice cuántos elementos hay de cada categoría, lo cual puede ahorrarnos mucho tiempo si tenemos muchos datos y/o muchas categorías.


Comentarios finales

Con esto ya nos estamos adentrando al mundo de los análisis de datos, pero aún falta un poco de programación básica que necesitamos ver para empezar por completo, y será crucial que entendamos bien cómo funcionan los factores para ese entonces.

La siguiente entrada será sobre data frames, y nuestro conocimiento sobre vectores y factores nos ayudará a comprenderlas.

Eso es todo, ¡gracias por leer!


Esta publicación fue hecha usando R versión 3.6.3 (2020-02-29).

ADVERTISEMENT



← Publicación más antigua Publicación más reciente →


Acerca del autor


Foto del autor

Rosa Molina

Rosa es nuestra bióloga experta en R. Le gusta la observación de aves y tocar el piano de vez en cuando.



Artículo sugerido



0 comentarios

Dejar un comentario

Por seguridad, los comentarios deben ser aprobados antes de ser publicados