

---
title: "MCAP1 - Cómo filtrar datos"
author: "DASR"
---
# Introducción al manejo de datos {dplyr}
<!--Original content: https://stat545.com/block009_dplyr-intro.html-->
## Intro
[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.
```{r start_dplyr}
library(tidyverse)
```
Carga el paquete con los datos traducidos.
```{r message = FALSE, warning = FALSE}
#install.packages("datos")
library(datos)
library(gapminder)
```
### Primeros tibble de `gapminder`
Los datos de `gapminder` tienen una estructura de datos particular:el tibble.
```{r}
gapminder
```
```{r}
#install.packages("datos")
#library(datos)
#datos
```
Para convertir cualquier conjunto de datos a tibble usa `as_tibble()`:
```{r}
as_tibble(iris)
```
## Antes de que crees secciones de tus datos...
Si piensas que sería buena idea extraer solo una parte de tus datos:
```{r}
(canada <- gapminder[241:252, ])
```
Pregúntate primero...
> ¿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`.
```{r}
filter(gapminder, lifeExp < 29)
filter(gapminder, country == "Rwanda", year > 1979)
filter(gapminder, country %in% c("Rwanda", "Afghanistan"))
```
Compara con código base de R que también realiza las mismas funciones:
```{r eval = FALSE}
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:
```{r eval = FALSE}
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.
```{r eval = FALSE}
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).
```{r}
gapminder %>% head()
```
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 de`gapminder`, indicaríamos `head(gapminder, 3)` o, con *pipe*:
```{r}
gapminder %>% head(3)
```
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:
```{r}
select(gapminder, year, lifeExp)
```
Esta es la misma operación pero escrita con el operador *pipe* y el comando`head()`:
```{r}
gapminder %>%
select(year, lifeExp) %>%
head(4)
```
La instrucción aquí es: "Toma `gapminder`, posteriormente selecciona las variables *year* y *lifeExp*, después muestra las primeras 4 filas."
## La conveniencia del operador *%>%*
Estos son los datos para México, pero solo algunas variables:
```{r}
gapminder %>%
filter(country == "Mexico") %>%
select(year, lifeExp)
```
De esta forma se llamarían los mismos datos con R base:
```{r end_dplyr}
gapminder[gapminder$country == "Mexico", c("year", "lifeExp")]
```
## Funciones puras
> 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.
Background Colour
Font Face
Font Size
Text Colour
Font Kerning
Image Visibility
Letter Spacing
Line Height
Link Highlight