Filtrar todos los factores de una variable categórica en un dataframe de R

Supongamos que tenemos un conjunto de datos en R, y una de las columnas se corresponde con una variable categórica o factorial. En esta entrada os mostraré cómo filtrar todos los factores de una variable categórica en un dataframe de R.

Quiero leer...

Datos de ejemplo iris

Empleamos los datos de ejemplo iris, que se encuentra dentro del paquete datasets.

data(iris) # cargamos los datos
str(iris)  # vemos su estructura
'data.frame':    150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
head(iris) # vemos las primeras seis filas
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Como podemos ver, la columna Species está compuesta por 3 factores: virginica, setosa y versicolor.

Filtrar todos los factores de una variable categórica en un dataframe con split()

Vamos a dividir el conjunto de datos en tantos dataframes como especies haya, cada uno con una espcie en concreto. Para ello empleamos la función split(), localizado en el paquete base. Esta función es esencial para filtrar todos los factores de una variable categórica en un dataframe.

especies <- split(iris, iris$Species)

Como hemos visto, split() tiene básicamente 2 argumentos principales:

  • iris: el nombre del conjunto de datos a filtrar o subseleccionar.
  • iris$Species: la columna con la variable factorial.

Si vemos la estructura ahora del objeto especies creado con los diferentes factores, vemos que se ha creado una lista compuesta con 3 dataframes, cada uno correspondiente a una especie diferente.

class(especies) # vemos la clase de objeto
[1] "list"
str(especies)    # vemos la estructura
List of 3
 $ setosa    :'data.frame':  50 obs. of  5 variables:
  ..$ Sepal.Length: num [1:50] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
  ..$ Sepal.Width : num [1:50] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
  ..$ Petal.Length: num [1:50] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
  ..$ Petal.Width : num [1:50] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
  ..$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ versicolor:'data.frame':  50 obs. of  5 variables:
  ..$ Sepal.Length: num [1:50] 7 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 ...
  ..$ Sepal.Width : num [1:50] 3.2 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 ...
  ..$ Petal.Length: num [1:50] 4.7 4.5 4.9 4 4.6 4.5 4.7 3.3 4.6 3.9 ...
  ..$ Petal.Width : num [1:50] 1.4 1.5 1.5 1.3 1.5 1.3 1.6 1 1.3 1.4 ...
  ..$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ virginica :'data.frame':  50 obs. of  5 variables:
  ..$ Sepal.Length: num [1:50] 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 ...
  ..$ Sepal.Width : num [1:50] 3.3 2.7 3 2.9 3 3 2.5 2.9 2.5 3.6 ...
  ..$ Petal.Length: num [1:50] 6 5.1 5.9 5.6 5.8 6.6 4.5 6.3 5.8 6.1 ...
  ..$ Petal.Width : num [1:50] 2.5 1.9 2.1 1.8 2.2 2.1 1.7 1.8 1.8 2.5 ...
  ..$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 3 3 3 3 3 3 3 3 3 3 ...

Añadir los dataframes a nuestro ambiente de trabajo

Anteriormente vimos cómo crear una lista con tantos dataframes como tantos factores hubieran en la columna con la variable categórica en cuestión. Este es el modo de proceder estándar.

Pero podríamos estar interesados en poder extraer los dataframes de un modo independientes y añadirlos a nuestro ambiente de trabajo.

Esto lo podemos hacer con la función list2env().

list2env(especies, .GlobalEnv)
<environment: R_GlobalEnv>

Esta función tiene dos argumentos principales:

  • especies: añadimos la lista con los diferentes dataframes.
  • .GlobalEnv: indicamos dónde se van a almacenar los dataframes. En este caso será nuestro ambiente de trabajo.

1 comentario en «Filtrar todos los factores de una variable categórica en un dataframe de R»

Deja un comentario