

---
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.
Color del Fondo
Tipo de Letra
Tamaño del Font
Color del Texto
Kerning de las letras
Visibilidad de imágenes
Espacio Entre Letras
Altura de Línea
Resaltado del Enlace