class: left, middle, title-slide .title[ # Elementos DS ] .subtitle[ ## 03 Transformación de datos
dplyr
] .author[ ###
Joshua Kunst
@jbkunst
] .date[ ### 2022-05-31 ] --- ## Transformación de datos > La visualización es una herramienta importante para la generación de conocimiento; sin embargo, es raro que obtengas los datos exactamente en la forma en que los necesitas. A menudo tendrás que crear algunas variables nuevas o resúmenes, o tal vez solo quieras cambiar el nombre de las variables o reordenar las observaciones para facilitar el trabajo con los datos. Lo anterior es un _copy & paste_ desde [R4DS](https://es.r4ds.hadley.nz/transform.html). --- ## `dplyr` Lo básico En este capítulo, aprenderás las cinco funciones clave de **dplyr** que te permiten resolver la gran mayoría de tus desafíos de manipulación de datos: * Filtrar o elegir las observaciones por sus valores (`filter()` — del inglés filtrar). * Reordenar las filas (`arrange()` — del inglés organizar). * Seleccionar las variables por sus nombres (`select()` — del inglés seleccionar). * Crear nuevas variables con transformaciones de variables existentes (`mutate()` — del inglés mutar o transformar). * Contraer muchos valores en un solo resumen (`summarise()` — del inglés resumir). Todas estas funciones se pueden usar junto con `group_by()` (del inglés _agrupar por_), que cambia el alcance de cada función para que actúe ya no sobre todo el conjunto de datos sino de grupo en grupo. --- ## `dplyr` Lo básico (2) Todos los verbos funcionan de manera similar: 1. El primer argumento es un *data frame*. 2. Los argumentos posteriores describen qué hacer con el *data frame* usando los nombres de las variables (sin comillas). 3. El resultado es un nuevo *data frame*. En conjunto, estas propiedades hacen que sea fácil encadenar varios pasos simples para lograr un resultado complejo. Nuevamente, lo anterior es un _copy & paste_ desde [R4DS](https://es.r4ds.hadley.nz/transform.html). --- background-image: url(images/dplyr/dplyr_filter.jpg) background-size: cover --- ## `filter` Seleccionar Filas <img src="images/dplyr/filter.png" width="70%" style="display: block; margin: auto;" /> --- ## `filter` ejemplo <img src="images/dplyr/filter_example.png" width="80%" style="display: block; margin: auto;" /> --- count: false ## <code>filter</code> Código .panel1-filter-auto[ ```r *storms ``` ] .panel2-filter-auto[ ``` ## # A tibble: 6 × 4 ## storm wind pressure date ## <chr> <dbl> <dbl> <date> ## 1 Alberto 110 1007 2000-08-03 ## 2 Alex 45 1009 1998-07-27 ## 3 Allison 65 1005 1995-06-03 ## 4 Ana 40 1013 1997-06-30 ## 5 Arlene 50 1010 1999-06-11 ## 6 Arthur 45 1010 1996-06-17 ``` ] --- count: false ## <code>filter</code> Código .panel1-filter-auto[ ```r storms |> * filter(storm %in% c("Alberto", "Ana")) ``` ] .panel2-filter-auto[ ``` ## # A tibble: 2 × 4 ## storm wind pressure date ## <chr> <dbl> <dbl> <date> ## 1 Alberto 110 1007 2000-08-03 ## 2 Ana 40 1013 1997-06-30 ``` ] <style> .panel1-filter-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-filter-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-filter-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- ## `select` Seleccionar Columnas <img src="images/dplyr/select.png" width="70%" style="display: block; margin: auto;" /> --- ## `select` ejemplo <img src="images/dplyr/select_example.png" width="80%" style="display: block; margin: auto;" /> --- count: false ## <code>select</code> Código .panel1-select-auto[ ```r *storms ``` ] .panel2-select-auto[ ``` ## # A tibble: 6 × 4 ## storm wind pressure date ## <chr> <dbl> <dbl> <date> ## 1 Alberto 110 1007 2000-08-03 ## 2 Alex 45 1009 1998-07-27 ## 3 Allison 65 1005 1995-06-03 ## 4 Ana 40 1013 1997-06-30 ## 5 Arlene 50 1010 1999-06-11 ## 6 Arthur 45 1010 1996-06-17 ``` ] --- count: false ## <code>select</code> Código .panel1-select-auto[ ```r storms |> * select(storm, pressure) ``` ] .panel2-select-auto[ ``` ## # A tibble: 6 × 2 ## storm pressure ## <chr> <dbl> ## 1 Alberto 1007 ## 2 Alex 1009 ## 3 Allison 1005 ## 4 Ana 1013 ## 5 Arlene 1010 ## 6 Arthur 1010 ``` ] <style> .panel1-select-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-select-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-select-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- ## `arrange` Ordenar Filas <img src="images/dplyr/arrange.png" width="70%" style="display: block; margin: auto;" /> --- ## `arrange` ejemplo <img src="images/dplyr/arrange_example.png" width="80%" style="display: block; margin: auto;" /> --- count: false ## <code>arrange</code> Código .panel1-arrange-auto[ ```r *storms ``` ] .panel2-arrange-auto[ ``` ## # A tibble: 6 × 4 ## storm wind pressure date ## <chr> <dbl> <dbl> <date> ## 1 Alberto 110 1007 2000-08-03 ## 2 Alex 45 1009 1998-07-27 ## 3 Allison 65 1005 1995-06-03 ## 4 Ana 40 1013 1997-06-30 ## 5 Arlene 50 1010 1999-06-11 ## 6 Arthur 45 1010 1996-06-17 ``` ] --- count: false ## <code>arrange</code> Código .panel1-arrange-auto[ ```r storms |> * arrange(wind) ``` ] .panel2-arrange-auto[ ``` ## # A tibble: 6 × 4 ## storm wind pressure date ## <chr> <dbl> <dbl> <date> ## 1 Ana 40 1013 1997-06-30 ## 2 Alex 45 1009 1998-07-27 ## 3 Arthur 45 1010 1996-06-17 ## 4 Arlene 50 1010 1999-06-11 ## 5 Allison 65 1005 1995-06-03 ## 6 Alberto 110 1007 2000-08-03 ``` ] <style> .panel1-arrange-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-arrange-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-arrange-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- background-image: url(images/dplyr/dplyr_mutate.png) background-size: contain --- ## `mutate` Crear (o transformar) Columnas <img src="images/dplyr/mutate.png" width="70%" style="display: block; margin: auto;" /> --- ## `mutate` ejemplo <img src="images/dplyr/mutate_example.png" width="80%" style="display: block; margin: auto;" /> --- count: false ## <code>mutate</code> Código .panel1-mutate-auto[ ```r *storms ``` ] .panel2-mutate-auto[ ``` ## # A tibble: 6 × 4 ## storm wind pressure date ## <chr> <dbl> <dbl> <date> ## 1 Alberto 110 1007 2000-08-03 ## 2 Alex 45 1009 1998-07-27 ## 3 Allison 65 1005 1995-06-03 ## 4 Ana 40 1013 1997-06-30 ## 5 Arlene 50 1010 1999-06-11 ## 6 Arthur 45 1010 1996-06-17 ``` ] --- count: false ## <code>mutate</code> Código .panel1-mutate-auto[ ```r storms |> * mutate( * ratio = pressure/wind, * inverse = 1/ratio * ) ``` ] .panel2-mutate-auto[ ``` ## # A tibble: 6 × 6 ## storm wind pressure date ratio inverse ## <chr> <dbl> <dbl> <date> <dbl> <dbl> ## 1 Alberto 110 1007 2000-08-03 9.15 0.109 ## 2 Alex 45 1009 1998-07-27 22.4 0.0446 ## 3 Allison 65 1005 1995-06-03 15.5 0.0647 ## 4 Ana 40 1013 1997-06-30 25.3 0.0395 ## 5 Arlene 50 1010 1999-06-11 20.2 0.0495 ## 6 Arthur 45 1010 1996-06-17 22.4 0.0446 ``` ] --- count: false ## <code>mutate</code> Código .panel1-mutate-auto[ ```r storms |> mutate( ratio = pressure/wind, inverse = 1/ratio ) |> * mutate(wind = log(wind)) ``` ] .panel2-mutate-auto[ ``` ## # A tibble: 6 × 6 ## storm wind pressure date ratio inverse ## <chr> <dbl> <dbl> <date> <dbl> <dbl> ## 1 Alberto 4.70 1007 2000-08-03 9.15 0.109 ## 2 Alex 3.81 1009 1998-07-27 22.4 0.0446 ## 3 Allison 4.17 1005 1995-06-03 15.5 0.0647 ## 4 Ana 3.69 1013 1997-06-30 25.3 0.0395 ## 5 Arlene 3.91 1010 1999-06-11 20.2 0.0495 ## 6 Arthur 3.81 1010 1996-06-17 22.4 0.0446 ``` ] <style> .panel1-mutate-auto { color: black; width: 32.6666666666667%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-mutate-auto { color: black; width: 65.3333333333333%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-mutate-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- ## `summarise` Resumir Columnas <img src="images/dplyr/summarise.png" width="70%" style="display: block; margin: auto;" /> --- ## `summarise` ejemplo <img src="images/dplyr/summarise_example.png" width="80%" style="display: block; margin: auto;" /> --- count: false ## <code>summarise</code> Código .panel1-summarise-auto[ ```r *pollution ``` ] .panel2-summarise-auto[ ``` ## # A tibble: 6 × 3 ## city size amount ## <chr> <chr> <dbl> ## 1 New York large 23 ## 2 New York small 14 ## 3 London large 22 ## 4 London small 16 ## 5 Beijing large 121 ## 6 Beijing small 56 ``` ] --- count: false ## <code>summarise</code> Código .panel1-summarise-auto[ ```r pollution |> * summarise(median = median(amount)) ``` ] .panel2-summarise-auto[ ``` ## # A tibble: 1 × 1 ## median ## <dbl> ## 1 22.5 ``` ] <style> .panel1-summarise-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-summarise-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-summarise-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- ## `group_by |> summarise` Resumir Columnas por Grupos <img src="images/dplyr/group_by_summarize.png" width="70%" style="display: block; margin: auto;" /> --- ## `group_by |> summarise` ejemplo <img src="images/dplyr/group_by_summarize_example.png" width="80%" style="display: block; margin: auto;" /> --- count: false ## <code>group_by |> summarise</code> Código .panel1-group_by-auto[ ```r *pollution ``` ] .panel2-group_by-auto[ ``` ## # A tibble: 6 × 3 ## city size amount ## <chr> <chr> <dbl> ## 1 New York large 23 ## 2 New York small 14 ## 3 London large 22 ## 4 London small 16 ## 5 Beijing large 121 ## 6 Beijing small 56 ``` ] --- count: false ## <code>group_by |> summarise</code> Código .panel1-group_by-auto[ ```r pollution |> * group_by(city) ``` ] .panel2-group_by-auto[ ``` ## # A tibble: 6 × 3 ## # Groups: city [3] ## city size amount ## <chr> <chr> <dbl> ## 1 New York large 23 ## 2 New York small 14 ## 3 London large 22 ## 4 London small 16 ## 5 Beijing large 121 ## 6 Beijing small 56 ``` ] --- count: false ## <code>group_by |> summarise</code> Código .panel1-group_by-auto[ ```r pollution |> group_by(city) |> * summarise( * mean = mean(amount), * sum = sum(amount), * n = n() * ) ``` ] .panel2-group_by-auto[ ``` ## # A tibble: 3 × 4 ## city mean sum n ## <chr> <dbl> <dbl> <int> ## 1 Beijing 88.5 177 2 ## 2 London 19 38 2 ## 3 New York 18.5 37 2 ``` ] <style> .panel1-group_by-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-group_by-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-group_by-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- count: false ## <code>group_by |> summarise</code> Código <small>(spanish version)</small> .panel1-group_by_spanish-auto[ ```r *pollution ``` ] .panel2-group_by_spanish-auto[ ``` ## # A tibble: 6 × 3 ## city size amount ## <chr> <chr> <dbl> ## 1 New York large 23 ## 2 New York small 14 ## 3 London large 22 ## 4 London small 16 ## 5 Beijing large 121 ## 6 Beijing small 56 ``` ] --- count: false ## <code>group_by |> summarise</code> Código <small>(spanish version)</small> .panel1-group_by_spanish-auto[ ```r pollution |> * group_by(city) ``` ] .panel2-group_by_spanish-auto[ ``` ## # A tibble: 6 × 3 ## # Groups: city [3] ## city size amount ## <chr> <chr> <dbl> ## 1 New York large 23 ## 2 New York small 14 ## 3 London large 22 ## 4 London small 16 ## 5 Beijing large 121 ## 6 Beijing small 56 ``` ] --- count: false ## <code>group_by |> summarise</code> Código <small>(spanish version)</small> .panel1-group_by_spanish-auto[ ```r pollution |> group_by(city) |> * summarise( * promedio = mean(amount), * suma = sum(amount), * conteo = n() * ) ``` ] .panel2-group_by_spanish-auto[ ``` ## # A tibble: 3 × 4 ## city promedio suma conteo ## <chr> <dbl> <dbl> <int> ## 1 Beijing 88.5 177 2 ## 2 London 19 38 2 ## 3 New York 18.5 37 2 ``` ] <style> .panel1-group_by_spanish-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-group_by_spanish-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-group_by_spanish-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- ## Ejercicio: en un script de R: <small> 1. Cargue el paquete `tidyverse`, y cree un data frame con columnas `x` e `y`, cada una de las columnas sea 1000 números aleatorios entre -1 y 1 (recuerde la función `runif`). 1. Genere un gráfico de puntos visualizando como se relacionan las variables `x` e `y`. 1. Con la función `mutate` cree una variable `r` que sea igual a `x^2 + y^2`, es decir `\(x^2 + y^2\)`. 1. Utilize la función `if_else` (y `mutate`) para generar una cuarta variable cuya definición es: si `r` es mayor que 1 entonces vale "A", en caso contrario "B". Llame esta variable como `r2`. 1. Ahora vuelva generar el gráfico de 3. pero coloreando el punto de acuerdo a la variable `r2`. 1. Utilice el _combo_ `group_by(r2) |> count()` para contar cuantos son "A" y "B", y luego generar la columna `p = n/sum(n)`. 1. Cree la columna `es_b` que indique con un 1 si el valor de `r2` es "B" y 0 si es "A", para luego crear la columna `convergencia` al aplicar la función `cummean` a la columna `es_b`. 1. con ayuda de la función `row_number()` genere la columna `fila` y haga un gráfico de líneas con `x = fila` e `y = 4 * convergencia`. </small> --- count: false ## Posible solución .panel1-solucion-auto[ ```r *library(tidyverse) ``` ] .panel2-solucion-auto[ ] --- count: false ## Posible solución .panel1-solucion-auto[ ```r library(tidyverse) *set.seed(123) ``` ] .panel2-solucion-auto[ ] --- count: false ## Posible solución .panel1-solucion-auto[ ```r library(tidyverse) set.seed(123) *df <- tibble( * x = runif(1000, -1, 1), * y = runif(1000, -1, 1) *) ``` ] .panel2-solucion-auto[ ] --- count: false ## Posible solución .panel1-solucion-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(1000, -1, 1), y = runif(1000, -1, 1) ) *df ``` ] .panel2-solucion-auto[ ``` ## # A tibble: 1,000 × 2 ## x y ## <dbl> <dbl> ## 1 -0.425 -0.453 ## 2 0.577 0.188 ## 3 -0.182 -0.680 ## 4 0.766 0.707 ## 5 0.881 0.695 ## 6 -0.909 -0.0442 ## 7 0.0562 0.547 ## 8 0.785 -0.409 ## 9 0.103 -0.869 ## 10 -0.0868 -0.119 ## # … with 990 more rows ``` ] --- count: false ## Posible solución .panel1-solucion-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(1000, -1, 1), y = runif(1000, -1, 1) ) df |> * mutate(r = x^2 + y^2) ``` ] .panel2-solucion-auto[ ``` ## # A tibble: 1,000 × 3 ## x y r ## <dbl> <dbl> <dbl> ## 1 -0.425 -0.453 0.385 ## 2 0.577 0.188 0.368 ## 3 -0.182 -0.680 0.495 ## 4 0.766 0.707 1.09 ## 5 0.881 0.695 1.26 ## 6 -0.909 -0.0442 0.828 ## 7 0.0562 0.547 0.303 ## 8 0.785 -0.409 0.783 ## 9 0.103 -0.869 0.765 ## 10 -0.0868 -0.119 0.0217 ## # … with 990 more rows ``` ] --- count: false ## Posible solución .panel1-solucion-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(1000, -1, 1), y = runif(1000, -1, 1) ) df |> mutate(r = x^2 + y^2) |> * mutate(r2 = if_else(r > 1, "A", "B")) ``` ] .panel2-solucion-auto[ ``` ## # A tibble: 1,000 × 4 ## x y r r2 ## <dbl> <dbl> <dbl> <chr> ## 1 -0.425 -0.453 0.385 B ## 2 0.577 0.188 0.368 B ## 3 -0.182 -0.680 0.495 B ## 4 0.766 0.707 1.09 A ## 5 0.881 0.695 1.26 A ## 6 -0.909 -0.0442 0.828 B ## 7 0.0562 0.547 0.303 B ## 8 0.785 -0.409 0.783 B ## 9 0.103 -0.869 0.765 B ## 10 -0.0868 -0.119 0.0217 B ## # … with 990 more rows ``` ] --- count: false ## Posible solución .panel1-solucion-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(1000, -1, 1), y = runif(1000, -1, 1) ) df |> mutate(r = x^2 + y^2) |> mutate(r2 = if_else(r > 1, "A", "B")) |> * mutate(es_b = if_else(r2 == "B", 1, 0)) ``` ] .panel2-solucion-auto[ ``` ## # A tibble: 1,000 × 5 ## x y r r2 es_b ## <dbl> <dbl> <dbl> <chr> <dbl> ## 1 -0.425 -0.453 0.385 B 1 ## 2 0.577 0.188 0.368 B 1 ## 3 -0.182 -0.680 0.495 B 1 ## 4 0.766 0.707 1.09 A 0 ## 5 0.881 0.695 1.26 A 0 ## 6 -0.909 -0.0442 0.828 B 1 ## 7 0.0562 0.547 0.303 B 1 ## 8 0.785 -0.409 0.783 B 1 ## 9 0.103 -0.869 0.765 B 1 ## 10 -0.0868 -0.119 0.0217 B 1 ## # … with 990 more rows ``` ] --- count: false ## Posible solución .panel1-solucion-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(1000, -1, 1), y = runif(1000, -1, 1) ) df |> mutate(r = x^2 + y^2) |> mutate(r2 = if_else(r > 1, "A", "B")) |> mutate(es_b = if_else(r2 == "B", 1, 0)) |> * mutate(conv = cummean(es_b)) ``` ] .panel2-solucion-auto[ ``` ## # A tibble: 1,000 × 6 ## x y r r2 es_b conv ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> ## 1 -0.425 -0.453 0.385 B 1 1 ## 2 0.577 0.188 0.368 B 1 1 ## 3 -0.182 -0.680 0.495 B 1 1 ## 4 0.766 0.707 1.09 A 0 0.75 ## 5 0.881 0.695 1.26 A 0 0.6 ## 6 -0.909 -0.0442 0.828 B 1 0.667 ## 7 0.0562 0.547 0.303 B 1 0.714 ## 8 0.785 -0.409 0.783 B 1 0.75 ## 9 0.103 -0.869 0.765 B 1 0.778 ## 10 -0.0868 -0.119 0.0217 B 1 0.8 ## # … with 990 more rows ``` ] --- count: false ## Posible solución .panel1-solucion-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(1000, -1, 1), y = runif(1000, -1, 1) ) df |> mutate(r = x^2 + y^2) |> mutate(r2 = if_else(r > 1, "A", "B")) |> mutate(es_b = if_else(r2 == "B", 1, 0)) |> mutate(conv = cummean(es_b)) |> * mutate(fila = row_number()) ``` ] .panel2-solucion-auto[ ``` ## # A tibble: 1,000 × 7 ## x y r r2 es_b conv fila ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <int> ## 1 -0.425 -0.453 0.385 B 1 1 1 ## 2 0.577 0.188 0.368 B 1 1 2 ## 3 -0.182 -0.680 0.495 B 1 1 3 ## 4 0.766 0.707 1.09 A 0 0.75 4 ## 5 0.881 0.695 1.26 A 0 0.6 5 ## 6 -0.909 -0.0442 0.828 B 1 0.667 6 ## 7 0.0562 0.547 0.303 B 1 0.714 7 ## 8 0.785 -0.409 0.783 B 1 0.75 8 ## 9 0.103 -0.869 0.765 B 1 0.778 9 ## 10 -0.0868 -0.119 0.0217 B 1 0.8 10 ## # … with 990 more rows ``` ] <style> .panel1-solucion-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-solucion-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-solucion-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- count: false ## Posible solución v2 .panel1-solucion2-auto[ ```r *library(tidyverse) ``` ] .panel2-solucion2-auto[ ] --- count: false ## Posible solución v2 .panel1-solucion2-auto[ ```r library(tidyverse) *set.seed(123) ``` ] .panel2-solucion2-auto[ ] --- count: false ## Posible solución v2 .panel1-solucion2-auto[ ```r library(tidyverse) set.seed(123) *df <- tibble( * x = runif(10000, -1, 1), * y = runif(10000, -1, 1) *) ``` ] .panel2-solucion2-auto[ ] --- count: false ## Posible solución v2 .panel1-solucion2-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) *df ``` ] .panel2-solucion2-auto[ ``` ## # A tibble: 10,000 × 2 ## x y ## <dbl> <dbl> ## 1 -0.425 -0.379 ## 2 0.577 -0.351 ## 3 -0.182 0.741 ## 4 0.766 -0.343 ## 5 0.881 -0.749 ## 6 -0.909 -0.288 ## 7 0.0562 0.861 ## 8 0.785 0.750 ## 9 0.103 0.640 ## 10 -0.0868 -0.956 ## # … with 9,990 more rows ``` ] --- count: false ## Posible solución v2 .panel1-solucion2-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) df |> * mutate( * r = x^2 + y^2, * ri = r < 1, * conv = cummean(ri), * row = row_number() * ) ``` ] .panel2-solucion2-auto[ ``` ## # A tibble: 10,000 × 6 ## x y r ri conv row ## <dbl> <dbl> <dbl> <lgl> <dbl> <int> ## 1 -0.425 -0.379 0.324 TRUE 1 1 ## 2 0.577 -0.351 0.456 TRUE 1 2 ## 3 -0.182 0.741 0.581 TRUE 1 3 ## 4 0.766 -0.343 0.704 TRUE 1 4 ## 5 0.881 -0.749 1.34 FALSE 0.8 5 ## 6 -0.909 -0.288 0.909 TRUE 0.833 6 ## 7 0.0562 0.861 0.745 TRUE 0.857 7 ## 8 0.785 0.750 1.18 FALSE 0.75 8 ## 9 0.103 0.640 0.421 TRUE 0.778 9 ## 10 -0.0868 -0.956 0.922 TRUE 0.8 10 ## # … with 9,990 more rows ``` ] --- count: false ## Posible solución v2 .panel1-solucion2-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) df |> mutate( r = x^2 + y^2, ri = r < 1, conv = cummean(ri), row = row_number() ) |> * ggplot() ``` ] .panel2-solucion2-auto[ <img src="03-AED-Transformacion-de-datos-dplyr-tidyr_files/figure-html/solucion2_auto_06_output-1.svg" width="100%" /> ] --- count: false ## Posible solución v2 .panel1-solucion2-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) df |> mutate( r = x^2 + y^2, ri = r < 1, conv = cummean(ri), row = row_number() ) |> ggplot() + * geom_line(aes(row, 4 * conv)) ``` ] .panel2-solucion2-auto[ <img src="03-AED-Transformacion-de-datos-dplyr-tidyr_files/figure-html/solucion2_auto_07_output-1.svg" width="100%" /> ] --- count: false ## Posible solución v2 .panel1-solucion2-auto[ ```r library(tidyverse) set.seed(123) df <- tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) df |> mutate( r = x^2 + y^2, ri = r < 1, conv = cummean(ri), row = row_number() ) |> ggplot() + geom_line(aes(row, 4 * conv)) + * geom_hline(yintercept = pi, color = "darkred") ``` ] .panel2-solucion2-auto[ <img src="03-AED-Transformacion-de-datos-dplyr-tidyr_files/figure-html/solucion2_auto_08_output-1.svg" width="100%" /> ] <style> .panel1-solucion2-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-solucion2-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-solucion2-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- count: false ## Posible solución v3 .panel1-solucion3-auto[ ```r *library(tidyverse) ``` ] .panel2-solucion3-auto[ ] --- count: false ## Posible solución v3 .panel1-solucion3-auto[ ```r library(tidyverse) *set.seed(123) ``` ] .panel2-solucion3-auto[ ] --- count: false ## Posible solución v3 .panel1-solucion3-auto[ ```r library(tidyverse) set.seed(123) *tibble( * x = runif(10000, -1, 1), * y = runif(10000, -1, 1) *) ``` ] .panel2-solucion3-auto[ ``` ## # A tibble: 10,000 × 2 ## x y ## <dbl> <dbl> ## 1 -0.425 -0.379 ## 2 0.577 -0.351 ## 3 -0.182 0.741 ## 4 0.766 -0.343 ## 5 0.881 -0.749 ## 6 -0.909 -0.288 ## 7 0.0562 0.861 ## 8 0.785 0.750 ## 9 0.103 0.640 ## 10 -0.0868 -0.956 ## # … with 9,990 more rows ``` ] --- count: false ## Posible solución v3 .panel1-solucion3-auto[ ```r library(tidyverse) set.seed(123) tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) |> * mutate( * r = x^2 + y^2, * ri = r < 1, * conv = cummean(ri), * row = row_number() * ) ``` ] .panel2-solucion3-auto[ ``` ## # A tibble: 10,000 × 6 ## x y r ri conv row ## <dbl> <dbl> <dbl> <lgl> <dbl> <int> ## 1 -0.425 -0.379 0.324 TRUE 1 1 ## 2 0.577 -0.351 0.456 TRUE 1 2 ## 3 -0.182 0.741 0.581 TRUE 1 3 ## 4 0.766 -0.343 0.704 TRUE 1 4 ## 5 0.881 -0.749 1.34 FALSE 0.8 5 ## 6 -0.909 -0.288 0.909 TRUE 0.833 6 ## 7 0.0562 0.861 0.745 TRUE 0.857 7 ## 8 0.785 0.750 1.18 FALSE 0.75 8 ## 9 0.103 0.640 0.421 TRUE 0.778 9 ## 10 -0.0868 -0.956 0.922 TRUE 0.8 10 ## # … with 9,990 more rows ``` ] --- count: false ## Posible solución v3 .panel1-solucion3-auto[ ```r library(tidyverse) set.seed(123) tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) |> mutate( r = x^2 + y^2, ri = r < 1, conv = cummean(ri), row = row_number() ) |> * ggplot() ``` ] .panel2-solucion3-auto[ <img src="03-AED-Transformacion-de-datos-dplyr-tidyr_files/figure-html/solucion3_auto_05_output-1.svg" width="100%" /> ] --- count: false ## Posible solución v3 .panel1-solucion3-auto[ ```r library(tidyverse) set.seed(123) tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) |> mutate( r = x^2 + y^2, ri = r < 1, conv = cummean(ri), row = row_number() ) |> ggplot() + * geom_line(aes(row, 4 * conv)) ``` ] .panel2-solucion3-auto[ <img src="03-AED-Transformacion-de-datos-dplyr-tidyr_files/figure-html/solucion3_auto_06_output-1.svg" width="100%" /> ] --- count: false ## Posible solución v3 .panel1-solucion3-auto[ ```r library(tidyverse) set.seed(123) tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) |> mutate( r = x^2 + y^2, ri = r < 1, conv = cummean(ri), row = row_number() ) |> ggplot() + geom_line(aes(row, 4 * conv)) + * geom_hline(yintercept = pi, color = "darkred") ``` ] .panel2-solucion3-auto[ <img src="03-AED-Transformacion-de-datos-dplyr-tidyr_files/figure-html/solucion3_auto_07_output-1.svg" width="100%" /> ] --- count: false ## Posible solución v3 .panel1-solucion3-auto[ ```r library(tidyverse) set.seed(123) tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) |> mutate( r = x^2 + y^2, ri = r < 1, conv = cummean(ri), row = row_number() ) |> ggplot() + geom_line(aes(row, 4 * conv)) + geom_hline(yintercept = pi, color = "darkred") + * scale_x_continuous(labels = scales::comma_format()) ``` ] .panel2-solucion3-auto[ <img src="03-AED-Transformacion-de-datos-dplyr-tidyr_files/figure-html/solucion3_auto_08_output-1.svg" width="100%" /> ] --- count: false ## Posible solución v3 .panel1-solucion3-auto[ ```r library(tidyverse) set.seed(123) tibble( x = runif(10000, -1, 1), y = runif(10000, -1, 1) ) |> mutate( r = x^2 + y^2, ri = r < 1, conv = cummean(ri), row = row_number() ) |> ggplot() + geom_line(aes(row, 4 * conv)) + geom_hline(yintercept = pi, color = "darkred") + scale_x_continuous(labels = scales::comma_format()) + * scale_y_continuous( * sec.axis = sec_axis(trans = ~., breaks = pi, labels = expression(pi)) * ) ``` ] .panel2-solucion3-auto[ <img src="03-AED-Transformacion-de-datos-dplyr-tidyr_files/figure-html/solucion3_auto_09_output-1.svg" width="100%" /> ] <style> .panel1-solucion3-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-solucion3-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-solucion3-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- ## El Pipe (_paip_) `|>` Los pipes son una herramienta poderosa para expresar claramente una secuencia de múltiples operaciones. Hasta aquí, has venido usándolos sin saber cómo funcionan o qué alternativas existen. En este capítulo ya es tiempo de explorarlos en más detalle. En él aprenderás qué alternativas existen, cuándo no deberías utilizarlos y algunas herramientas útiles relacionadas. De forma general veremos que `z |> f()` es equivalente a `f(z)` y en el caso de aplicar parámetros extras tenemos que `z |> g(y)` es `g(x, y)`. En el próximo ejemplo veremos que el **pipe** (`|>` o `%>%`) ayuda a la legibilidad del código. Más en el capítulo [Pipes](https://es.r4ds.hadley.nz/pipes.html) en R4DS. --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r *x <- 34 ``` ] .panel2-pipe-auto[ ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 *tan(cos(sqrt(log(x)))) ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) *y <- x ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) y <- x *y <- log(y) ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) y <- x y <- log(y) *y <- sqrt(y) ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) y <- x y <- log(y) y <- sqrt(y) *y <- cos(y) ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) y <- x y <- log(y) y <- sqrt(y) y <- cos(y) *y <- tan(y) ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) y <- x y <- log(y) y <- sqrt(y) y <- cos(y) y <- tan(y) *y ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ``` ## [1] -0.311816 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) y <- x y <- log(y) y <- sqrt(y) y <- cos(y) y <- tan(y) y *x ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ``` ## [1] -0.311816 ``` ``` ## [1] 34 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) y <- x y <- log(y) y <- sqrt(y) y <- cos(y) y <- tan(y) y x |> * log() ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ``` ## [1] -0.311816 ``` ``` ## [1] 3.526361 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) y <- x y <- log(y) y <- sqrt(y) y <- cos(y) y <- tan(y) y x |> log() |> * sqrt() ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ``` ## [1] -0.311816 ``` ``` ## [1] 1.877861 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) y <- x y <- log(y) y <- sqrt(y) y <- cos(y) y <- tan(y) y x |> log() |> sqrt() |> * cos() ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ``` ## [1] -0.311816 ``` ``` ## [1] -0.3022616 ``` ] --- count: false ## Ejemplo pipe .panel1-pipe-auto[ ```r x <- 34 tan(cos(sqrt(log(x)))) y <- x y <- log(y) y <- sqrt(y) y <- cos(y) y <- tan(y) y x |> log() |> sqrt() |> cos() |> * tan() ``` ] .panel2-pipe-auto[ ``` ## [1] -0.311816 ``` ``` ## [1] -0.311816 ``` ``` ## [1] -0.311816 ``` ] <style> .panel1-pipe-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-pipe-auto { color: black; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-pipe-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- ## Ejercicio en grupo! Un solo grupo! 1. Cargue **tidyverse** y el paquete **datos**. 1. Explore las tablas `vuelos`, `aeropuertos`, y `aerolineas`. Represente en un mapa los distintos vuelos realizados enfatizando los más usuales. 1. **Avanzado**: Utilice los paquete `ggforce` y `edgebundle` para replicar lo realizado en el ejericio anterior utizando como _template_ el ejemplo mostrado en https://github.com/schochastics/edgebundle. 1. Estudie los datos (como hoy es 4 de mayo) `starwars` del paquete `dplyr`. Haga un gráfico de estatura peso utilizando puntos y graficando un posible modelo con `geom_smooth()`. _Póngale color_, de verdad, utilice el paquete `showtext` para tematizar el gráfico. [Link](https://isabella-b.com/blog/ggplot2-theme-elements-reference/) de interés. Inspiración adicional por parte de [Cédric Scherer](https://twitter.com/CedScherer). --- ## Más información sobre transformación de datos - [Transformación de datos](https://es.r4ds.hadley.nz/transform.html) en R4DS. - [Tidy data tutor](https://tidydatatutor.com/vis.html), visualizar _pipelines_ de transformación de datos.