Transformación de datos con dplyr

Dplyr Data Science Tidyverse

Utilice verbos dplyr básicos para filtrar filas, seleccionar columnas y ordenar/organizar conjuntos de datos en combinación con el operador pipe %>%.

Author

Affiliation

Franklin Santos ORCID ID

Agritech Bolivia

Published

Jan. 10, 2022

Citation

Santos, 2022

Introducción a dplyr

dplyr facilita el proceso de transformación de datos al proporcionar un marco enriquecido para manipular marcos de datos. Las funciones de dplyr se pueden concatenar a potentes canalizaciones de transformación para seleccionar, filtrar, ordenar, unir y agregar datos.

¿Qué es dplyr?

Existe la broma de que el 80 % de la ciencia de datos está limpiando los datos y el 20 % se queja de limpiar los datos. — Anthony Goldbloom, fundador y CEO de Kaggle

Tener datos limpios en cualquier proyecto de Data Science es muy importante, porque los resultados solo son tan buenos como los datos correctos. La limpieza de datos también es la parte que generalmente consume la mayor parte del tiempo y causa los mayores dolores para los científicos de datos. R ya ofrece un amplio conjunto de herramientas y funciones para manipular marcos de datos. Sin embargo, debido a su larga historia, el conjunto de herramientas base R disponible está fragmentado y es difícil de usar para nuevos usuarios.

El paquete dplyr facilita el proceso de transformación de datos a través de una colección consistente de funciones. Estas funciones admiten diferentes transformaciones en marcos de datos, que incluyen

Múltiples marcos de datos también se pueden unir mediante valores de atributo comunes.

La coherencia de las funciones de dplyr mejora la usabilidad y permite al usuario conectar transformaciones para formar canalizaciones de datos. Estas canalizaciones también se pueden ver como un lenguaje de consulta de alto nivel, como p. Ej. el lenguaje SQL para consultas de bases de datos. Además, incluso es posible traducir las canalizaciones de datos creadas a otros back-end, incluidas las bases de datos.

Marco de funciones

Cada función de transformación de datos en dplyr acepta un marco de datos como su primer parámetro de entrada y devuelve el marco de datos transformado como salida. Un plano para una función dplyr típica se ve así:

transformed <- dplyr_function(my_data_frame, 
                              param_one, 
                              param_two, 
                              ...)

La función dplyr_function se puede personalizar aún más a través de argumentos adicionales (param_one, param_two) colocados después del primer parámetro de marco de datos (my_data_frame).

El poder real de dplyr viene con el operador pipe %>% que permite a los usuarios concatenar funciones de dplyr a pipe de datos. Pipe inyecta el marco de datos resultante del cálculo anterior como primer argumento del siguiente. Una transformación de datos que consta de tres funciones se parece a:

dplyr_function_three(
  dplyr_function_two(
    dplyr_function_one(input_data_frame)))

pero con pipe se puede escribir de la siguiente manera:

input_data_frame %>%
  dplyr_function_one() %>%
  dplyr_function_two() %>%
  dplyr_function_three()

El orden de lectura diferente de las funciones de transformación de datos en el orden de transformación real, hace que las canalizaciones sean más fáciles de leer que las llamadas a funciones anidadas.

Seleccionar columnas de un marco de datos

Para seleccionar sólo un conjunto específico de columnas de marcos de datos interesantes, dplyr ofrece la función select() para extraer columnas por nombres, índices y rangos. Incluso puede renombrar las columnas extraídas con select().

select(my_data_frame, column_one, column_two, ...)
select(my_data_frame, new_column_name = current_column, ...)
select(my_data_frame, column_start:column_end)
select(my_data_frame, index_one, index_two, ...)
select(my_data_frame, index_start:index_end)

Seleccionando por nombre

select(my_data_frame, column_one, column_two, ...)

En este capítulo veremos el conjunto de datos pres_results del paquete politicaldata. Contiene datos sobre las elecciones presidenciales de EE.UU. desde 1976, convertidas en un Tibble para una mejor impresión.

# A tibble: 561 × 6
    year state total_votes   dem   rep   other
   <dbl> <chr>       <dbl> <dbl> <dbl>   <dbl>
 1  1976 AK         123574 0.357 0.579 0.0549 
 2  1976 AL        1182850 0.557 0.426 0.0163 
 3  1976 AR         767535 0.650 0.349 0.00134
 4  1976 AZ         742719 0.398 0.564 0.0383 
 5  1976 CA        7803770 0.480 0.497 0.0230 
 6  1976 CO        1081440 0.426 0.540 0.0336 
 7  1976 CT        1386355 0.467 0.519 0.0138 
 8  1976 DC         168830 0.816 0.165 0.0169 
 9  1976 DE         235642 0.520 0.466 0.0144 
10  1976 FL        3150631 0.519 0.466 0.0143 
# … with 551 more rows

Para este ejemplo, veremos el número total de votos en diferentes estados en diferentes elecciones. Como solo estamos interesados en la cantidad de personas que votaron, nos gustaría crear una versión personalizada del marco de datos pres_results que solo contenga las columnas year, state y total_votes. Para dicho filtrado, podemos usar la función select() del paquete dplyr.

La función select() toma un marco de datos como parámetro de entrada y nos permite decidir cuál de las columnas queremos mantener. El resultado de la función es un marco de datos con todas las filas, pero que contiene solo las columnas que seleccionamos explícitamente.

Podemos reducir nuestro conjunto de datos a solo year, state y total_votes de la siguiente manera:

tibble(
select(pres_results, year, state, total_votes)
)
# A tibble: 561 × 3
    year state total_votes
   <dbl> <chr>       <dbl>
 1  1976 AK         123574
 2  1976 AL        1182850
 3  1976 AR         767535
 4  1976 AZ         742719
 5  1976 CA        7803770
 6  1976 CO        1081440
 7  1976 CT        1386355
 8  1976 DC         168830
 9  1976 DE         235642
10  1976 FL        3150631
# … with 551 more rows

Como primer parámetro pasamos el marco de datos pres_results, como parámetros restantes pasamos las columnas que queremos mantener para select().

Además de mantener las columnas que queremos, la función select() también las mantiene en el mismo orden que especificamos en los parámetros de la función.

Si cambiamos el orden de los parámetros cuando llamamos a la función, las columnas de la salida cambian en consecuencia:

tibble(
select(pres_results, total_votes, year, state)
)
# A tibble: 561 × 3
   total_votes  year state
         <dbl> <dbl> <chr>
 1      123574  1976 AK   
 2     1182850  1976 AL   
 3      767535  1976 AR   
 4      742719  1976 AZ   
 5     7803770  1976 CA   
 6     1081440  1976 CO   
 7     1386355  1976 CT   
 8      168830  1976 DC   
 9      235642  1976 DE   
10     3150631  1976 FL   
# … with 551 more rows

Renombrar nombres de columnas

select(my_data_frame, new_column_name = current_column, ...)

Además de definir las columnas que queremos conservar, también podemos cambiarles el nombre. Para hacer esto, necesitamos establecer el nuevo nombre de columna dentro de la función select() usando el comando

new_column_name = current_column

En el siguiente ejemplo, seleccionamos las columnas year, state y total_votes pero cambiamos el nombre de la columna year a Election en la salida:

tibble(
select(pres_results, Election = year, state, total_votes)
)
# A tibble: 561 × 3
   Election state total_votes
      <dbl> <chr>       <dbl>
 1     1976 AK         123574
 2     1976 AL        1182850
 3     1976 AR         767535
 4     1976 AZ         742719
 5     1976 CA        7803770
 6     1976 CO        1081440
 7     1976 CT        1386355
 8     1976 DC         168830
 9     1976 DE         235642
10     1976 FL        3150631
# … with 551 more rows

Selección por rango de nombre

select(my_data_frame, column_start:column_end)

Cuando usamos la función select() y definimos las columnas que queremos mantener, dplyr en realidad no usa el nombre de las columnas sino el índice de las columnas en el marco de datos. Esto significa que, cuando definimos las primeras tres columnas del marco de datos pres_results, year, state y total_votes, dplyr convierte estos nombres en los valores de índice 1, 2 y 3. Por lo tanto, también podemos usar el nombre de las columnas, aplicar el operador : y definir rangos de columnas, que queremos mantener:

tibble(
select(pres_results, year:total_votes)
)
# A tibble: 561 × 3
    year state total_votes
   <dbl> <chr>       <dbl>
 1  1976 AK         123574
 2  1976 AL        1182850
 3  1976 AR         767535
 4  1976 AZ         742719
 5  1976 CA        7803770
 6  1976 CO        1081440
 7  1976 CT        1386355
 8  1976 DC         168830
 9  1976 DE         235642
10  1976 FL        3150631
# … with 551 more rows

Lo que hace year:total_votes, se puede traducir a 1:3, que es simplemente crear un vector de valores numéricos del 1 al 3. Luego, la función select() toma el marco de datos pres_results y genera un subconjunto del mismo, manteniendo solo Las primeras tres columnas.

Select() por índices

select(my_data_frame, index_one, index_two, ...)
select(my_data_frame, index_start:index_end)

La función select() también se puede usar con índices de columna. En lugar de usar nombres, debemos especificar las columnas que queremos seleccionar por sus índices. En comparación con otros lenguajes de programación, la indexación en R comienza con uno en lugar de cero. Para seleccionar la primera, cuarta y quinta columna del conjunto de datos pres_results podemos escribir

tibble(
select(pres_results, 1,4,5)
)
# A tibble: 561 × 3
    year   dem   rep
   <dbl> <dbl> <dbl>
 1  1976 0.357 0.579
 2  1976 0.557 0.426
 3  1976 0.650 0.349
 4  1976 0.398 0.564
 5  1976 0.480 0.497
 6  1976 0.426 0.540
 7  1976 0.467 0.519
 8  1976 0.816 0.165
 9  1976 0.520 0.466
10  1976 0.519 0.466
# … with 551 more rows

De manera similar a la definición de rangos de columnas usando sus nombres, podemos definir rangos (o vectores) de valores de índice en su lugar:

tibble(
select(pres_results, 1:3)
)
# A tibble: 561 × 3
    year state total_votes
   <dbl> <chr>       <dbl>
 1  1976 AK         123574
 2  1976 AL        1182850
 3  1976 AR         767535
 4  1976 AZ         742719
 5  1976 CA        7803770
 6  1976 CO        1081440
 7  1976 CT        1386355
 8  1976 DC         168830
 9  1976 DE         235642
10  1976 FL        3150631
# … with 551 more rows

Filtrar filas de marcos de datos

A menudo queremos operar sólo en un subconjunto específico de filas de un marco de datos. La función dplyr filter() proporciona una forma flexible de extraer las filas de interés en base a múltiples condiciones.

filter(my_data_frame, condition)
filter(my_data_frame, condition_one, condition_two, ...)

Función filter()

filter(my_data_frame, condition)

La función filter() toma un marco de datos y una o más expresiones de filtrado como parámetros de entrada. Procesa el marco de datos y mantiene solo las filas que cumplen con las expresiones de filtrado definidas. Estas expresiones pueden verse como reglas para la evaluación y el mantenimiento de filas. En la mayoría de los casos, se basan en operadores relacionales. Como ejemplo, podríamos filtrar el marco de datos pres_results y mantener solo las filas, donde la variable de state es igual a "CA" (California):

tibble(
filter(pres_results, state == "CA")
)
# A tibble: 11 × 6
    year state total_votes   dem   rep  other
   <dbl> <chr>       <dbl> <dbl> <dbl>  <dbl>
 1  1976 CA        7803770 0.480 0.497 0.0230
 2  1980 CA        8582938 0.359 0.527 0.114 
 3  1984 CA        9505041 0.413 0.575 0.0122
 4  1988 CA        9887065 0.476 0.511 0.0131
 5  1992 CA       11131721 0.460 0.326 0.213 
 6  1996 CA       10019469 0.511 0.382 0.107 
 7  2000 CA       10965822 0.534 0.417 0.0490
 8  2004 CA       12421353 0.543 0.444 0.0117
 9  2008 CA       13561900 0.610 0.370 0.0188
10  2012 CA       13038547 0.602 0.371 0.0246
11  2016 CA       14181595 0.617 0.316 0.0581

En el resultado, podemos comparar los resultados de las elecciones en California para diferentes años.

Como otro ejemplo, podríamos filtrar el marco de datos pres_results y mantener solo aquellas filas, donde la variable dem (porcentaje de votos para el Partido Demócrata) es mayor que 0.85:

tibble(
filter(pres_results, dem > 0.85)
)
# A tibble: 7 × 6
   year state total_votes   dem    rep   other
  <dbl> <chr>       <dbl> <dbl>  <dbl>   <dbl>
1  1984 DC         211288 0.854 0.137  0.00886
2  1996 DC         185726 0.852 0.0934 0.0513 
3  2000 DC         201894 0.852 0.0895 0.0563 
4  2004 DC         227586 0.892 0.0934 0.0125 
5  2008 DC         265853 0.925 0.0653 0.00582
6  2012 DC         293764 0.909 0.0728 0.0155 
7  2016 DC         312575 0.905 0.0407 0.0335 

En el resultado podemos ver para cada año electoral los estados donde el Partido Demócrata obtuvo más del 85% de los votos. Según los resultados, podríamos decir que el Partido Demócrata tiene una base sólida de votantes en el Distrito de Columbia (conocido como Washington, D.C.).

Múltiples expresiones de filtro

filter(my_data_frame, condition_one, condition_two, ...)

La función filter() también puede tomar múltiples reglas de filtrado como entrada. Estos pueden verse como una combinación de reglas con el operador &. Para que una fila se incluya en la salida, todas las reglas de filtrado deben cumplirse. En el siguiente ejemplo, filtramos el marco de datos pres_results para todas las filas donde la variable state es igual a "CA" y la variable de year es igual a 2016:

tibble(
filter(pres_results, state == "CA", year==2016)
)
# A tibble: 1 × 6
   year state total_votes   dem   rep  other
  <dbl> <chr>       <dbl> <dbl> <dbl>  <dbl>
1  2016 CA       14181595 0.617 0.316 0.0581

Obtenemos una sola fila como salida, que contiene los resultados de las elecciones presidenciales de 2016 en los Estados Unidos para el estado de California.

Ejercicio: Usar filter() con múltiples reglas El conjunto de datos del gapminder contiene datos económicos y demográficos sobre diversos países desde 1952. Filtra el tibble e inspecciona qué países tenían una esperanza de vida de más de 80 años en el año 2007. Los paquetes necesarios ya están cargados.

  1. Utiliza la función filter() en el tibble de gapminder.
  2. Filtra todas las filas en las que la variable year es igual a 2007 y la esperanza de vida lifeExp es mayor de 80!

Solución

tibble(
filter(gapminder, year==2007, lifeExp > 80)
)
# A tibble: 13 × 6
   country          continent  year lifeExp       pop gdpPercap
   <fct>            <fct>     <int>   <dbl>     <int>     <dbl>
 1 Australia        Oceania    2007    81.2  20434176    34435.
 2 Canada           Americas   2007    80.7  33390141    36319.
 3 France           Europe     2007    80.7  61083916    30470.
 4 Hong Kong, China Asia       2007    82.2   6980412    39725.
 5 Iceland          Europe     2007    81.8    301931    36181.
 6 Israel           Asia       2007    80.7   6426679    25523.
 7 Italy            Europe     2007    80.5  58147733    28570.
 8 Japan            Asia       2007    82.6 127467972    31656.
 9 New Zealand      Oceania    2007    80.2   4115771    25185.
10 Norway           Europe     2007    80.2   4627926    49357.
11 Spain            Europe     2007    80.9  40448191    28821.
12 Sweden           Europe     2007    80.9   9031088    33860.
13 Switzerland      Europe     2007    81.7   7554661    37506.

Ejercicio El conjunto de datos del gapminder contiene datos económicos y demográficos sobre diversos países desde 1952. Filtra el tibble de gapminder e inspecciona qué países tenían una población de más de 1.000.000.000 en el año 2007! Los paquetes necesarios ya están cargados.

  1. Utiliza la función filter() en el tibble gapminder.
  2. Filtra todas las filas donde la variable year es igual a 2007 y la población pop es mayor de 1000000000!
filter(gapminder, year==2007, pop > 1000000000)
# A tibble: 2 × 6
  country continent  year lifeExp        pop gdpPercap
  <fct>   <fct>     <int>   <dbl>      <int>     <dbl>
1 China   Asia       2007    73.0 1318683096     4959.
2 India   Asia       2007    64.7 1110396331     2452.

Ordenar marcos de datos por columnas

Para seleccionar las áreas de interés en un marco de datos, a menudo es necesario ordenarlas por columnas específicas. La función dplyr arrange() permite ordenar los marcos de datos por múltiples columnas en orden ascendente y descendente.

arrange(my_data_frame, column_one)
arrange(my_data_frame, column_one, column_two, ...)

La función arrange() con una sola columna

arrange(my_data_frame, column_one)

La función arrange() ordena las filas de un marco de datos. Toma un marco de datos o un tibble como primer parámetro y los nombres de las columnas en función de los cuales las filas deben ordenarse como parámetros adicionales. Supongamos que queremos responder la pregunta: ¿Qué estados tuvieron el mayor porcentaje de votantes republicanos en las elecciones presidenciales de 2016 en los Estados Unidos? Para responder a esta pregunta, en el siguiente ejemplo usamos el marco de datos pres_results_2016, que contiene información solo para las elecciones presidenciales de EE.UU. de 2016. Nuestra función arrange() en el marco de datos rep basado en la columna (votos republicanos en porcentaje):

pres_results_2016 <- pres_results %>%
  filter(year==2016)
tibble(
arrange(pres_results_2016, rep)
)
# A tibble: 51 × 6
    year state total_votes   dem    rep  other
   <dbl> <chr>       <dbl> <dbl>  <dbl>  <dbl>
 1  2016 DC         312575 0.905 0.0407 0.0335
 2  2016 HI         437664 0.610 0.294  0.0958
 3  2016 VT         320467 0.557 0.298  0.0737
 4  2016 CA       14181595 0.617 0.316  0.0581
 5  2016 MA        3378821 0.591 0.323  0.0858
 6  2016 MD        2781446 0.603 0.339  0.0415
 7  2016 NY        7802084 0.584 0.361  0.0530
 8  2016 WA        3317019 0.525 0.368  0.0738
 9  2016 IL        5536424 0.558 0.388  0.0517
10  2016 RI         464144 0.544 0.389  0.0466
# … with 41 more rows

Como puede ver en la salida, el marco de datos se ordena en orden ascendente según la columna rep. Sin embargo, preferiríamos tener los resultados en orden descendente, para que podamos ver instantáneamente state con el mayor porcentaje de repeticiones. Para ordenar una columna en orden descendente, todo lo que tenemos que hacer es aplicar la función desc() en la columna dada dentro de la función arrange():

tibble(
arrange(pres_results_2016, desc(rep))
)
# A tibble: 51 × 6
    year state total_votes   dem   rep  other
   <dbl> <chr>       <dbl> <dbl> <dbl>  <dbl>
 1  2016 WV         713051 0.265 0.686 0.0489
 2  2016 WY         258788 0.216 0.674 0.0830
 3  2016 OK        1452992 0.289 0.653 0.0575
 4  2016 ND         344360 0.272 0.630 0.0971
 5  2016 KY        1924149 0.327 0.625 0.0476
 6  2016 AL        2123372 0.344 0.621 0.0254
 7  2016 SD         370093 0.317 0.615 0.0673
 8  2016 TN        2508027 0.347 0.607 0.0401
 9  2016 AR        1130635 0.337 0.606 0.0577
10  2016 ID         690255 0.275 0.593 0.132 
# … with 41 more rows

La organización no solo es posible en valores numéricos, sino también en valores de caracteres. En ese caso, dplyr ordena las filas en orden alfabético. Podemos organizar columnas de caracteres como las numéricas:

tibble(
arrange(pres_results_2016, state)
)
# A tibble: 51 × 6
    year state total_votes   dem    rep  other
   <dbl> <chr>       <dbl> <dbl>  <dbl>  <dbl>
 1  2016 AK         318608 0.366 0.513  0.0928
 2  2016 AL        2123372 0.344 0.621  0.0254
 3  2016 AR        1130635 0.337 0.606  0.0577
 4  2016 AZ        2573165 0.451 0.487  0.0547
 5  2016 CA       14181595 0.617 0.316  0.0581
 6  2016 CO        2780220 0.482 0.433  0.0859
 7  2016 CT        1644920 0.546 0.409  0.0435
 8  2016 DC         312575 0.905 0.0407 0.0335
 9  2016 DE         441590 0.534 0.419  0.0472
10  2016 FL        9420039 0.478 0.490  0.0315
# … with 41 more rows

La función arrange() con múltiples columnas

También podemos usar la función arrange() en varias columnas. En este caso, el orden de las columnas en los parámetros de la función establece una jerarquía de ordenamiento. La función comienza ordenando las filas en función de la primera columna definida en los parámetros. En caso de que haya varias filas con el mismo valor, la función decide el orden en función de la segunda columna definida en los parámetros. Si todavía hay varias filas con los mismos valores, la función decide en función de la tercera columna definida en los parámetros (si está definida) y así sucesivamente.

En el siguiente ejemplo, utilizamos el marco de datos pres_results_subset, que contiene los resultados de las elecciones solo para los estados: "TX" (Texas), "UT" (Utah) y "FL" (Florida). Primero ordenamos el marco de datos en orden descendente según la columna de year. Luego, agregamos un segundo nivel y ordenamos el marco de datos basado en la columna dem:

pres_results_subset <- pres_results %>%
  filter(state %in% c("TX",
                      "UT",
                      "FL"))
tibble(
arrange(pres_results_subset, year, dem)
)
# A tibble: 33 × 6
    year state total_votes   dem   rep    other
   <dbl> <chr>       <dbl> <dbl> <dbl>    <dbl>
 1  1976 UT         541218 0.336 0.624 0.0392  
 2  1976 TX        4071884 0.511 0.480 0.00817 
 3  1976 FL        3150631 0.519 0.466 0.0143  
 4  1980 UT         604152 0.206 0.728 0.0665  
 5  1980 FL        3686927 0.385 0.555 0.0597  
 6  1980 TX        4541636 0.414 0.553 0.0329  
 7  1984 UT         629656 0.247 0.745 0.00823 
 8  1984 FL        4180051 0.347 0.653 0.000212
 9  1984 TX        5397571 0.361 0.636 0.00275 
10  1988 UT         647008 0.320 0.662 0.0173  
# … with 23 more rows

Como puede ver en la salida, el marco de datos se ordena en general en función de la columna year. Sin embargo, cuando el valor de year es el mismo, el orden de las filas lo decide la columna dem.

Crear una tubería de transformación de datos

Todas las funciones de transformación de datos en dplyr pueden ser conectadas a través del operador de tubería (pipe) %>% para crear poderosas y a la vez expresivas tuberías de transformación de datos.

my_data_frame %>%
  filter(___) %>%
  select(___) %>%
  arrange(___)

Usando el operador %>%

El operador pipe %>% es una parte especial del universo tidyverse. Se utiliza para combinar múltiples funciones y ejecutarlas una tras otra. En esta configuración, la entrada de cada función es la salida de la función anterior. Imagine que tenemos el marco de datos pres_results y queremos crear un marco de datos más pequeño y transparente para responder a la pregunta: ¿En qué estados fue el partido democrático la opción más popular en las elecciones presidenciales de 2016 en los Estados Unidos? Para lograr esta tarea, deberíamos seguir los siguientes pasos:

  1. filter() el marco de datos para las filas, donde la variable year es igual a 2016
  2. select() las dos variables state y dem, ya que no estamos interesados en el resto de las columnas.
  3. arrange() el marco de datos filtrado y seleccionado en función de la columna dem de forma descendente.

Los pasos y funciones descritos anteriormente deben ejecutarse uno tras otro, donde la entrada de cada función es la salida del paso anterior. Aplicando las cosas que aprendió hasta ahora, puede realizar esta tarea siguiendo los siguientes pasos:

result <- filter(pres_results, year==2016)
result <- select(result, state, dem)
result <- arrange(result, desc(dem))
tibble(result)
# A tibble: 51 × 2
   state   dem
   <chr> <dbl>
 1 DC    0.905
 2 CA    0.617
 3 HI    0.610
 4 MD    0.603
 5 MA    0.591
 6 NY    0.584
 7 IL    0.558
 8 VT    0.557
 9 NJ    0.555
10 CT    0.546
# … with 41 more rows

La primera función toma el marco de datos pres_results, lo filtra de acuerdo con la descripción de la tarea y lo asigna a la variable result. Luego, cada función posterior toma la variable result como entrada y la sobrescribe con su propia salida.

El operador %>% proporciona una forma práctica de combinar los pasos anteriores en aparentemente un paso. Toma un marco de datos como entrada inicial. Luego, aplica una lista de funciones y pasa la salida de cada función para la entrada de la siguiente función. La misma tarea que la anterior se puede lograr usando el operador de tubería %>% de esta manera:

tibble(
pres_results %>%
  filter(year==2016) %>%
  select(state, dem, rep) %>%
  arrange(desc(dem))
)
# A tibble: 51 × 3
   state   dem    rep
   <chr> <dbl>  <dbl>
 1 DC    0.905 0.0407
 2 CA    0.617 0.316 
 3 HI    0.610 0.294 
 4 MD    0.603 0.339 
 5 MA    0.591 0.323 
 6 NY    0.584 0.361 
 7 IL    0.558 0.388 
 8 VT    0.557 0.298 
 9 NJ    0.555 0.414 
10 CT    0.546 0.409 
# … with 41 more rows

Podemos interpretar el código de la siguiente manera:

  1. Definimos el conjunto de datos original como punto de partida.
  2. El uso del operador %>% justo después del marco de datos le dice a dplyr, que viene una función, que toma el marco de datos previamente definido como entrada.
  3. Usamos cada función como de costumbre, pero omite el primer parámetro. La entrada del marco de datos se proporciona automáticamente por la salida del paso anterior.
  4. Mientras agreguemos el operador %>% después de un paso, dplyr esperará un paso adicional.
  5. En nuestro ejemplo, la tubería se cierra con una función arrange(). Obtiene la versión filtrada y seleccionada del marco de datos pres_results como entrada y la ordena en función de la columna dem de forma descendente. Finalmente, devuelve la salida.

Una diferencia entre los dos enfoques es que el operador %>% no guarda permanentemente los resultados intermedios o finales. Para guardar el marco de datos resultante, debemos asignar la salida a una variable:

result <- pres_results %<>%
  filter(year==2016) %>%
  select(state, dem) %>%
  arrange(desc(dem))
tibble(result)
# A tibble: 51 × 2
   state   dem
   <chr> <dbl>
 1 DC    0.905
 2 CA    0.617
 3 HI    0.610
 4 MD    0.603
 5 MA    0.591
 6 NY    0.584
 7 IL    0.558
 8 VT    0.557
 9 NJ    0.555
10 CT    0.546
# … with 41 more rows

Ejercicios:

Esperanza de vida austriaca

Utiliza el operador %>% en el conjunto de datos de gapminder y crea un simple marco de datos para responder a la siguiente pregunta: ¿Cómo ha cambiado la esperanza de vida en Austria en las últimas décadas? Los paquetes necesarios ya están cargados.

  1. Defina el marco de datos de gapminder como el marco de datos de base
  2. Filtra sólo las filas en las que la columna country es igual a Austria mediante la tubería gapminder a la función filter().
  3. Selecciona sólo las columnas: year y lifeExp del resultado filtrado.
  4. Ordena los resultados en base a la columna year en función de las columnas seleccionadas.

Solución:

gapminder %>%
  filter(country == "Austria") %>%
  select(year, lifeExp) %>%
  arrange(year)
# A tibble: 12 × 2
    year lifeExp
   <int>   <dbl>
 1  1952    66.8
 2  1957    67.5
 3  1962    69.5
 4  1967    70.1
 5  1972    70.6
 6  1977    72.2
 7  1982    73.2
 8  1987    74.9
 9  1992    76.0
10  1997    77.5
11  2002    79.0
12  2007    79.8

PIB europeo per cápita

Utiliza el operador %>% en el conjunto de datos de gapminder y crea un simple tibble para responder a la siguiente pregunta: ¿Qué país europeo tuvo el mayor PIB per cápita en 2007? Los paquetes requeridos ya están cargados.

  1. Defina el tibble de gapminder como la entrada
  2. Filtra sólo las filas donde la columna year es igual a 2007
  3. Usar una segunda capa de filtro y mantener sólo las filas donde la columna del continente es igual a Europe
  4. Seleccione sólo las columnas: country y gdpPercap
  5. Ordena los resultados basados en la columna gdpPercap de forma descendente
gapminder %>%
  filter(year == 2007, continent == "Europe") %>%
  select(country, gdpPercap) %>%
  arrange(desc(gdpPercap))
# A tibble: 30 × 2
   country     gdpPercap
   <fct>           <dbl>
 1 Norway         49357.
 2 Ireland        40676.
 3 Switzerland    37506.
 4 Netherlands    36798.
 5 Iceland        36181.
 6 Austria        36126.
 7 Denmark        35278.
 8 Sweden         33860.
 9 Belgium        33693.
10 Finland        33207.
# … with 20 more rows

Población de las Américas

Utiliza el operador %>% en el conjunto de datos de gapminder y crea un simple tibble para responder a la siguiente pregunta: ¿Qué país del continente americano tenía la mayor población en 2007?

  1. Defina el tibble de gapminder como la entrada
  2. Filtra sólo las filas donde la columna year es igual a 2007
  3. Utilice una segunda capa de filtro y mantenga sólo las filas donde la columna del continent es igual a Americas
  4. Seleccione sólo las columnas: country y pop
  5. Arregla los resultados basados en la columna pop de forma descendente
gapminder %>%
  filter(year == 2007, continent == "Americas") %>%
  select(country, pop) %>%
  arrange(desc(pop))
# A tibble: 25 × 2
   country             pop
   <fct>             <int>
 1 United States 301139947
 2 Brazil        190010647
 3 Mexico        108700891
 4 Colombia       44227550
 5 Argentina      40301927
 6 Canada         33390141
 7 Peru           28674757
 8 Venezuela      26084662
 9 Chile          16284741
10 Ecuador        13755680
# … with 15 more rows

Footnotes

    Citation

    For attribution, please cite this work as

    Santos (2022, Jan. 10). Franklin Santos: Transformación de datos con dplyr. Retrieved from https://franklinsantos.com/posts/2022-01-10-diplyr/

    BibTeX citation

    @misc{santos2022transformación,
      author = {Santos, Franklin},
      title = {Franklin Santos: Transformación de datos con dplyr},
      url = {https://franklinsantos.com/posts/2022-01-10-diplyr/},
      year = {2022}
    }