Verbos básicos de dplyr

Según un artículo publicado por forbes en 2016, cerca del 80% del tiempo de un proyecto relacionado con datos se dedica a la obtención y preparación de los datos. Los paquetes dplyr y tidyr tienen funciones para transformar, resumir y filtrar los datos, hacen que el código sea más legible y además corre más rápido que Rbase porque usa C++.

La legibilidad y simplicidad de dplyr se debe sobre todo al operador %>% del paquete magrittr y a los verbos (principales funciones del paquete), que hacen que el código escrito se parezca mucho a la forma cómo pensamos.

Requisitos

  1. Tener instalado R y dplyr
  2. Saber qué es una función y qué son los argumentos de una función en R
  3. Las ganas de aprender

Recomendado

  1. Utilizar RStudio
  2. Saber construir expresiones lógicas

Imprimir un data.frame con dplyr es mejor

Problema: Imprimir un data.frame sin colapsar la consola de R.
Solución: Utilizar la función as_tibble.

A veces necesitas ver los datos crudos para tener una idea de cómo son. Sin embargo, cuando imprimes un data.frame en la consola de R puedes colapsar la pantalla, incluso usando la función head() si la tabla tiene muchas columnas. Para evitar esto, puedes utilizar la función as_tibble. Un tibble es un tipo especial de data.frame lo suficientemente inteligente como para imprimir sin colapsar la pantalla.

iris <- as_tibble(iris)
class(iris)
## [1] "tbl_df"     "tbl"        "data.frame"
iris
## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            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           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # … with 140 more rows

Seleccionar columnas

Problema: Seleccionar sólo algunas columnas de un data.frame
Solución: Utilizar el verbo select

El primer argumento de la función select es el data.frame, y el resto de los argumentos son las columnas que quieres seleccionar. Importante, los nombres de las columnas van sin comillas.

select(iris, Sepal.Length, Sepal.Width)
## # A tibble: 150 x 2
##    Sepal.Length Sepal.Width
##           <dbl>       <dbl>
##  1          5.1         3.5
##  2          4.9         3  
##  3          4.7         3.2
##  4          4.6         3.1
##  5          5           3.6
##  6          5.4         3.9
##  7          4.6         3.4
##  8          5           3.4
##  9          4.4         2.9
## 10          4.9         3.1
## # … with 140 more rows

Para eliminar una columna utiliza - antes del nombre

select(iris, -Sepal.Length)
## # A tibble: 150 x 4
##    Sepal.Width Petal.Length Petal.Width Species
##          <dbl>        <dbl>       <dbl> <fct>  
##  1         3.5          1.4         0.2 setosa 
##  2         3            1.4         0.2 setosa 
##  3         3.2          1.3         0.2 setosa 
##  4         3.1          1.5         0.2 setosa 
##  5         3.6          1.4         0.2 setosa 
##  6         3.9          1.7         0.4 setosa 
##  7         3.4          1.4         0.3 setosa 
##  8         3.4          1.5         0.2 setosa 
##  9         2.9          1.4         0.2 setosa 
## 10         3.1          1.5         0.1 setosa 
## # … with 140 more rows

También puedes seleccionar columnas basadas en reglas utilizando las funciones auxiliares de select:

  • starts_with: Comienzan con este texto
  • ends_with: Terminan con este texto
  • contains: Contienen este texto
  • matches: Coinciden con esta expresión regular
  • num_range: Están en estas posiciones posiciones
  • one_of: Alguna de estas
  • everything: Todas
  • group_cols: Columnas usadas para agrupar
select(iris, starts_with('Sepal'))
## # A tibble: 150 x 2
##    Sepal.Length Sepal.Width
##           <dbl>       <dbl>
##  1          5.1         3.5
##  2          4.9         3  
##  3          4.7         3.2
##  4          4.6         3.1
##  5          5           3.6
##  6          5.4         3.9
##  7          4.6         3.4
##  8          5           3.4
##  9          4.4         2.9
## 10          4.9         3.1
## # … with 140 more rows
select(iris, ends_with('Length'))
## # A tibble: 150 x 2
##    Sepal.Length Petal.Length
##           <dbl>        <dbl>
##  1          5.1          1.4
##  2          4.9          1.4
##  3          4.7          1.3
##  4          4.6          1.5
##  5          5            1.4
##  6          5.4          1.7
##  7          4.6          1.4
##  8          5            1.5
##  9          4.4          1.4
## 10          4.9          1.5
## # … with 140 more rows

Puedes combinar selecciones de columnas específicas con funciones auxiliares y con exclusiones.

select(iris, starts_with('Sepal'), Petal.Length, -Sepal.Length)
## # A tibble: 150 x 2
##    Sepal.Width Petal.Length
##          <dbl>        <dbl>
##  1         3.5          1.4
##  2         3            1.4
##  3         3.2          1.3
##  4         3.1          1.5
##  5         3.6          1.4
##  6         3.9          1.7
##  7         3.4          1.4
##  8         3.4          1.5
##  9         2.9          1.4
## 10         3.1          1.5
## # … with 140 more rows

Estas funciones auxiliares también son útiles para combinarlas con mutate_at o summarise_at. Para más información, mira la sección Useful functions de ?dplyr::select.

Ordenar los datos

Problema: Ordenar los datos de un data.frame según una o más columnas
Solución: Utilizar el verbo arrange
El primer argumento de la función arrange es el data.frame que quieres ordenar, y los demás son las columnas por las cuales quieres ordenar.

arrange(iris, Species, Petal.Width)
## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          4.9         3.1          1.5         0.1 setosa 
##  2          4.8         3            1.4         0.1 setosa 
##  3          4.3         3            1.1         0.1 setosa 
##  4          5.2         4.1          1.5         0.1 setosa 
##  5          4.9         3.6          1.4         0.1 setosa 
##  6          5.1         3.5          1.4         0.2 setosa 
##  7          4.9         3            1.4         0.2 setosa 
##  8          4.7         3.2          1.3         0.2 setosa 
##  9          4.6         3.1          1.5         0.2 setosa 
## 10          5           3.6          1.4         0.2 setosa 
## # … with 140 more rows

Filtrar filas con el verbo filter

Problema: Filtrar filas de un data.frame según una condición de alguna de sus columnas
Solución: Utilizar el verbo filter

El primer argumento de la función filter es el data.frame, y los demás son las condiciones según las cuales quieres filtrar.

filter(iris, Species == 'setosa', Petal.Length > 1)
## # A tibble: 49 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            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           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # … with 39 more rows

Esto es equivalente a:

filter(iris, Species == 'setosa' & Petal.Length > 1)

También puedes utilizar otras expresiones lógicas más complejas, como:

filter(iris, Species == 'setosa' | (Petal.Width >= 1 & Petal.Width <= 1.5) )
## # A tibble: 98 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            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           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # … with 88 more rows

Transformar o crear columnas con el verbo mutate

Problema: Crear una nueva columna o modificar una existente a partir de otras
Solución: Utilizar el verbo mutate

El primer argumento de la función mutate es el data.frame, mientras que los demás argumentos son asignaciones en las que el nombre de la variable va del lado izquierdo (puede ser una variable que ya exista) y el valor que quieres asignarle va del lado derecho.

mutate(iris, Sepal.Ratio = Sepal.Width / Sepal.Length)
## # A tibble: 150 x 6
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Ratio
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>         <dbl>
##  1          5.1         3.5          1.4         0.2 setosa        0.686
##  2          4.9         3            1.4         0.2 setosa        0.612
##  3          4.7         3.2          1.3         0.2 setosa        0.681
##  4          4.6         3.1          1.5         0.2 setosa        0.674
##  5          5           3.6          1.4         0.2 setosa        0.72 
##  6          5.4         3.9          1.7         0.4 setosa        0.722
##  7          4.6         3.4          1.4         0.3 setosa        0.739
##  8          5           3.4          1.5         0.2 setosa        0.68 
##  9          4.4         2.9          1.4         0.2 setosa        0.659
## 10          4.9         3.1          1.5         0.1 setosa        0.633
## # … with 140 more rows

Conclusión

Con dplyr, las tareas de seleccionar columnas, filtrar filas, transformar variables y ordenar los datos son muy fáciles. En la próxima parte, te enseño a encadenar operaciones utilizando el operador %>% (en inglés pipe y pronunciado paip) y calcular medidas de resumen (como la media o los percentiles) por grupos.