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
- Tener instalado R y
dplyr
- Saber qué es una función y qué son los argumentos de una función en R
- Las ganas de aprender
Recomendado
- Utilizar RStudio
- 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 textoends_with
: Terminan con este textocontains
: Contienen este textomatches
: Coinciden con esta expresión regularnum_range
: Están en estas posiciones posicionesone_of
: Alguna de estaseverything
: Todasgroup_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.