```{r xaringan-themer, include=FALSE, warning=FALSE}
library(tidyverse)
library(xaringanthemer)
style_duo_accent(primary_color = "#1E90FF", secondary_color = "#FF6F61",
                 background_color = "#f8f7f3",
                 header_font_google = google_font("Archivo"),
                 text_font_google   = google_font("Inconsolata"), 
                 link_color= "#FFD700"
)
```



## Recapitulación
<br>

- Creación y transformación de datos con `dplyr`

- Manipulación de datos agrupados con `dplyr`


---

## Hoy hablaremos de ...

- Resumen de datos con `dplyr`

- Resumen de datos agrupados con `dplyr`

- Justar bases de datos con llave común

---

class: center, middle

![](images/tidyverse_packs.png)


---

class: fullscreen, left, middle, text-black
background-image: url("images/typewriter.jpg")

.huge[#dplyr]

---

## dplyr: herramientas intuitivas para manipulación de datos

<br>

.pull-left[
  ![dplyr](images/dplyr.png)
]

.pull-right[
`dplyr` permite:

- ordenar datos

- filtrar casos 

- seleccionar variables

- __crear y transformar variables__

- agrupar datos

- crear resumen estadísticos
]


---
class: inverse, center, middle

.huge[
**dplyr::summarise()**
]

---
## summarise: extrayendo información de los datos

La función `summarise()` permite calcular una variedad de medidas en base a los datos. 

--

- Una de las principales ventajas es que esta función retorna una base de datos con los resultados, que puede ser usado para posterior análisis (ej, gráficos).

--

- Combinando con `group_by()` resulta una herramiendo muy potente. 


---
## summarise: extrayendo información de los datos

```{r, echo=FALSE, message=FALSE}
library("readr") 

setwd(
  "~/Library/Mobile Documents/com~apple~CloudDocs/Teaching/ISUC/2023_2_data_analysis_r/repo/slides/class_5/")

# leer archivo csv
data_casen_csv <- read_csv("sample_casen2017.csv")
```


```{r, message=FALSE}
library(tidyverse)
data_casen_csv %>% 
  summarise(mean_ytotcor_region = mean(ytotcor, na.rm = T)) 
```

Obtenemos una bases de datos con los resultados.

--

Pero podemos transformarlo en otro tipo de objetos (vectores, matrices, etc)

```{r, message=FALSE}
data_casen_csv %>% 
  summarise(mean_ytotcor_region = mean(ytotcor, na.rm = T), 
            median_ytotcor_region = median(ytotcor, na.rm = T)) / 1000
```

---
## summarise: algunas funciones útiles

.pull-left[
- `median()`
- `sd()`
- `min()`, `max()`
- `quantile()`
- `first()`, `last()`, `nth()`
- `n()`, `n_distinct()`
- `any()`, `all()`

Ejemplo:

- Quantile:
```{r}
data_casen_csv %>% 
  summarise(q20=quantile(ytotcor, probs=0.2, na.rm = T))
```
]

--

.pull-right[

- 3er caso:
```{r}
data_casen_csv %>% 
  summarise(tercer=nth(ytotcor, n=3))
```

- Cantidad de valores distintos
```{r}
data_casen_csv %>% 
  summarise(distintos=n_distinct(ytotcor))
```
]

---
## summarise across() variables

`across()` facilita la aplicación de la misma transformación a múltiples columnas. Permite usar el tipo de semántica de `select()` dentro de `summarise()` y `mutate()`.

--

```{r, message=FALSE}
data_casen_csv %>% 
  summarise(across( c("sexo","edad"), mean))
```

--

```{r, message=FALSE}
data_casen_csv %>% 
  summarise(across(starts_with("y"), mean))
```


---
## summarise across() variables

`across()` facilita la aplicación de la misma transformación a múltiples columnas. Permite usar el tipo de semántica de `select()` dentro de `summarise()` y `mutate()`.


```{r, message=FALSE}
data_casen_csv %>% 
  summarise(across( c("sexo","edad"), mean))
```

--

```{r, message=FALSE}
data_casen_csv %>% 
  summarise(across(starts_with("y"), ~mean(.x, na.rm = TRUE) ))
```

---
## summarise una variable con una lista de funciones

```{r, message=FALSE}
data_casen_csv %>% 
  summarise(across(edad, list(media = mean, mediana = median)))
```

--

```{r, message=FALSE}
data_casen_csv %>% 
  summarise(across(ytrabajocor, list(media =  ~mean(.x, na.rm = TRUE), mediana = ~median(.x, na.rm = TRUE))))
```


---
## summarise muchas variable con una lista de funciones

```{r, message=FALSE}
data_casen_csv %>% 
  summarise(across(starts_with("y"), list(media = ~mean(.x, na.rm = TRUE), mediana= ~median(.x, na.rm = TRUE)) ))
```

---
## summarise by_group(): resumiendo datos agupados

```{r, message=FALSE}
data_casen_csv %>% 
  group_by(region, sexo) %>% #<<
  summarise(mean_ytotcor_region = mean(ytotcor, na.rm = T), 
            median_ytotcor_region = median(ytotcor, na.rm = T))
```

---
## summarise by_group(): resumiendo datos agupados

.center[
![loops](loops.jpeg)
]

---
## summarise by_group(): resumiendo datos agupados

Combinando herramientas

```{r, message=FALSE}
data_casen_csv %>% 
  group_by(region, sexo) %>% #<<
      summarise(across(ytrabajocor, list(media =  ~mean(.x, na.rm = TRUE), mediana = ~median(.x, na.rm = TRUE))))
```

---
## summarise: funciones externas

Supongamos que queremos calcular el indice de Gini para cada región de Chile.

```{r, message=FALSE}
library(ineq) #<<
data_casen_csv %>% 
  group_by(region, sexo) %>% 
  summarise(gini = Gini(ytotcor, na.rm = T)) #<<
```

---
## summarise: funciones propias

Supongamos que queremos calcular el indice de Gini para cada región de Chile.

```{r, message=FALSE}

ratio_9010 <- function(x) { quantile(x,p=0.9, na.rm=T)/quantile(x,p=0.1, na.rm =T)} #<<

data_casen_csv %>% 
  group_by(region, sexo) %>% 
  summarise(ratio9010 = ratio_9010(ytotcor)) #<<
```

---
class: inverse, center, middle

.huge[
**dplyr::join()**
]

---
## join: juntar bases de datos

These are generic functions that dispatch to individual tbl methods - see the method documentation for details of individual data sources


---
## join: juntar bases de datos

Dos bases de datos puede juntarse mientras tengan un llave común (region, aquí). 

.pull-left[
```{r, message=FALSE}
data_a <- data_casen_csv %>% filter(region <2 | region>=15 ) %>%
  group_by(region) %>% 
  summarise(across(edad, mean)); data_a
```  
]
.pull-right[
```{r, message=FALSE}
data_b <- data_casen_csv %>% filter(region <3 | region>=16 ) %>%
  group_by(region) %>% 
  summarise(across(c(edad,yautcorh), mean)); data_b
```  
]

--

<br>

Muchas formas de juntar ambas bases de datos.

---
## join: juntar bases de datos con (inner)

.pull-left[
`data_a`
```{r, echo=FALSE, message=FALSE}
data_a
```  
]
.pull-right[
`data_b`
```{r, echo=FALSE, message=FALSE}
data_b
```  
]

<br>
--

`inner_join()`
```{r,  message=FALSE}
data_a %>% inner_join(data_b, by="region")
```  

---
## join: juntar bases de datos con (inner)

.pull-left[
`data_a`
```{r, echo=FALSE, message=FALSE}
data_a
```  
]
.pull-right[
`data_b`
```{r, echo=FALSE, message=FALSE}
data_b
```  
]

<br>
--

`inner_join()`
```{r, message=FALSE}
data_a %>% inner_join(data_b %>% select(!edad), by="region")
```  

---
## join: juntar bases de datos con (inner)

.pull-left[
`data_a`
```{r, echo=FALSE, message=FALSE}
data_a
```  
]
.pull-right[
`data_b`
```{r, echo=FALSE, message=FALSE}
data_b
```  
]

<br>
--

`inner_join()`
```{r, message=FALSE}
data_a %>% select(!edad) %>% inner_join(data_b, by="region")
```  


---
## join: juntar bases de datos con (left)

.pull-left[
`data_a`
```{r, echo=FALSE, message=FALSE}
data_a
```  
]
.pull-right[
`data_b %>% select(!edad)`
```{r, echo=FALSE, message=FALSE}
data_b %>% select(!edad)
```  
]

<br>
--

`left_join()`
```{r, message=FALSE}
data_a %>% left_join(data_b  %>% select(!edad), by="region")
```  

--

.img-right[
![michael](images/michael_scott.gif)
]

---
## join: juntar bases de datos con (right)

.pull-left[
`data_a`
```{r, echo=FALSE, message=FALSE}
data_a
```  
]
.pull-right[
`data_b %>% select(!edad)`
```{r, echo=FALSE, message=FALSE}
data_b %>% select(!edad)
```  
]

<br>
--

`right_join()`
```{r, message=FALSE}
data_a  %>% right_join(data_b %>% select(!edad), by="region")
```  

---
## join: juntar bases de datos con (full)

.pull-left[
`data_a`
```{r, echo=FALSE, message=FALSE}
data_a
```  
]
.pull-right[
`data_b %>% select(!edad)`
```{r, echo=FALSE, message=FALSE}
data_b %>% select(!edad)
```  
]

<br>
--

`full_join()`
```{r, message=FALSE}
data_a  %>% full_join(data_b %>% select(!edad), by="region")
```  

---
## join: juntar bases de datos por más de una llave


.pull-left[
```{r, message=FALSE}
data_casen_csv %>% 
  select(region,sexo,yautcorh)
```
]

--

.pull-right[
```{r, message=FALSE}
gini_regsex <- data_casen_csv %>% 
  group_by(region,sexo) %>% #<<
  summarise(gini = Gini(yautcorh, na.rm = T )); gini_regsex
```  
]

--

Quiero incorporar la información agregada a mi bases de datos.

---
## join: juntar bases de datos por más de una llave

```{r, message=FALSE}
data_casen_csv %>% 
  left_join(gini_regsex, by=c("region","sexo")) %>% #<<
  select(region,sexo,yautcorh, gini)
```  




---
class: fullscreen,left, top, top, text-azzurro
background-image: url("images/bicicleta.jpg")

.huge[#R se aprende]
.huge[#usando y]
.huge[#preguntando]

---

![](images/stack-exchange-search.png)

---
class: inverse, middle

Presentación y código en GitHub: <https://github.com/mebucca/dar_soc4001>

---
class: inverse, center, middle

.huge[
**Gracias!**
]

<br>
Mauricio Bucca <br>
https://mebucca.github.io/ <br>
github.com/mebucca





