[dplyr] es un paquete para el manejo de datos, desarrollado por Hadley Wickham y Romain Francois. Se instala como parte de [tidyverse][tidyverse-web] al cargar library(tidyverse).
El origen de dplyr está en un paquete anterior llamado [plyr], que implementa el enfoque [“divide-aplica-combina” para análisis de datos]. El paquete dplyr se enfoca en conjunto de datos estructurados o “tibbles”.
Carga dplyr y gapminder
Primero, segúrate de cargar tidyverse, lo cual a su vez, descargará dplyr y otros paquetes que usaremos más adelante. También trabajaremos con una versión traducida de los datos precargados en tidyverse.
library(tidyverse)
Warning: package 'tidyverse' was built under R version 4.2.3
Warning: package 'ggplot2' was built under R version 4.2.3
Warning: package 'tibble' was built under R version 4.2.3
Warning: package 'tidyr' was built under R version 4.2.3
Warning: package 'readr' was built under R version 4.2.3
Warning: package 'purrr' was built under R version 4.2.3
Warning: package 'dplyr' was built under R version 4.2.3
Warning: package 'stringr' was built under R version 4.2.2
Warning: package 'forcats' was built under R version 4.2.3
Warning: package 'lubridate' was built under R version 4.2.3
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.2 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.4 ✔ tibble 3.2.1
✔ lubridate 1.9.2 ✔ tidyr 1.3.0
✔ purrr 1.0.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
¿Quiero crear mini conjuntos de datos para cada nivel o factor de mis datos?
Si la respuesta es SÍ, utiliza técnicas de agregación de datos o crea facetac con ggplot2 – no hagas subconjuntos de datos. Puedes, de forma temporal, hacer subconjuntos de datos temporalmente en lo que desarrollas un código más rápido y elegante.
Si la respuesta es NO, probablemente realizar subconjuntos funcione para ti. Considera si puedes usar el argumento subset =.
LAs copias y sub conjuntos consumen espacio en tu ambiente de trabajo, pueden crear confusiones y generar errores. Evita en la medida de lo posible.
Utiliza filter() para obtener un conjunto de datos por filas
filter() toma expresiones lógicas y devuelve filas donde dicha expresión es verdadera TRUE.
filter(gapminder, lifeExp <29)
# A tibble: 2 × 6
country continent year lifeExp pop gdpPercap
<fct> <fct> <int> <dbl> <int> <dbl>
1 Afghanistan Asia 1952 28.8 8425333 779.
2 Rwanda Africa 1992 23.6 7290203 737.
filter(gapminder, country =="Rwanda", year >1979)
# A tibble: 6 × 6
country continent year lifeExp pop gdpPercap
<fct> <fct> <int> <dbl> <int> <dbl>
1 Rwanda Africa 1982 46.2 5507565 882.
2 Rwanda Africa 1987 44.0 6349365 848.
3 Rwanda Africa 1992 23.6 7290203 737.
4 Rwanda Africa 1997 36.1 7212583 590.
5 Rwanda Africa 2002 43.4 7852401 786.
6 Rwanda Africa 2007 46.2 8860588 863.
filter(gapminder, country %in%c("Rwanda", "Afghanistan"))
# A tibble: 24 × 6
country continent year lifeExp pop gdpPercap
<fct> <fct> <int> <dbl> <int> <dbl>
1 Afghanistan Asia 1952 28.8 8425333 779.
2 Afghanistan Asia 1957 30.3 9240934 821.
3 Afghanistan Asia 1962 32.0 10267083 853.
4 Afghanistan Asia 1967 34.0 11537966 836.
5 Afghanistan Asia 1972 36.1 13079460 740.
6 Afghanistan Asia 1977 38.4 14880372 786.
7 Afghanistan Asia 1982 39.9 12881816 978.
8 Afghanistan Asia 1987 40.8 13867957 852.
9 Afghanistan Asia 1992 41.7 16317921 649.
10 Afghanistan Asia 1997 41.8 22227415 635.
# ℹ 14 more rows
Compara con código base de R que también realiza las mismas funciones:
gapminder[gapminder$lifeExp <29, ] ## la repetición de `gapminder` puede confundir, [i, j] la forma de indexar distrae.subset(gapminder, country =="Rwanda") ## similar a filter
Bajo ninguna circunstancia realices subconjuntos de datos como en el primer ejemplo:
excerpt <- gapminder[241:252, ]
¿Por qué es una mala idea?
No nos dice nada acerca de los datos. Debes conocer perfectamente la base de datos para saber qué hay de especial en las filas 241 a 252?
Es frágil en el sentido de que este código producirá resultados diferentes si alguien cambia el orden de las filas en gapminder, por ejemplo, si ordena los datos de mayor a menor en el script.
filter(gapminder, country =="Mexico")
En cambio, esta línea de código se explica a sí misma, sabemos que el filtro se está realizando por un determinado país.
Conoce el operador pipe
Debemos conocer el operador pipe que utiliza tidyverse del paquete [magrittr] de Stefan Bache. Con este operador ya no es necesario anidar operaciones múltiples con comandos idem, como muñecas tradicionales rusas. El uso de este operador nos lleva a una nueva sintaxis que es más sencilla de escribir y de leer.
Este es el operador pipe: %>%. En RStudio utiliza la combinación de teclas: Ctrl+Shift+M (Windows), Cmd+Shift+M (Mac).
gapminder %>%head()
# A tibble: 6 × 6
country continent year lifeExp pop gdpPercap
<fct> <fct> <int> <dbl> <int> <dbl>
1 Afghanistan Asia 1952 28.8 8425333 779.
2 Afghanistan Asia 1957 30.3 9240934 821.
3 Afghanistan Asia 1962 32.0 10267083 853.
4 Afghanistan Asia 1967 34.0 11537966 836.
5 Afghanistan Asia 1972 36.1 13079460 740.
6 Afghanistan Asia 1977 38.4 14880372 786.
Esto es equivalente a head(gapminder). El operador toma la instrucción del lado izquierdo y lo lleva pipes directo a la función de la derecha como si fuera el primer argumento.
Aún se pueden especificar otros argumentos en esta función, por ejemplo para ver las primeras 3 filas degapminder, indicaríamos head(gapminder, 3) o, con pipe:
gapminder %>%head(3)
# A tibble: 3 × 6
country continent year lifeExp pop gdpPercap
<fct> <fct> <int> <dbl> <int> <dbl>
1 Afghanistan Asia 1952 28.8 8425333 779.
2 Afghanistan Asia 1957 30.3 9240934 821.
3 Afghanistan Asia 1962 32.0 10267083 853.
En otros momentos te he aconsejado que pienses en “asignación” cuando ves el operador<-. De forma similar, te aconsejo que pienses “después o en consecuencia” cuando veas el operador pipe , %>%.
Utiliza select() para hacer un subconjunto de datos en variables o columnas de tu interés.
Utiliza select() para hacer un subconjunto de datos:
Funciones que se entienden facilmente y no tienen impacto en el ambiente de trabajo. Es decir, no tienen “efectos secundarios” más allá del valor que nos muestran.
El conjunto de datos es siempre el primer argumento de las funciones verbo.Lo veremos a detalle más adelante.