---
title: "TutorialDplyr"
author: "Ricardo Aler"
date: "1 Agosto 2019"
output:
  pdf_document: default
  html_document: default
---
## Introducci�n a dplyr

*dplyr* es una librer�a de manipulado de data.frames. La mayor�a de estas operaciones se pueden hacer ya con R-base, pero con *dplyr* son normalmente m�s r�pidas y m�s claras. *dplyr* manipula data.frames usando "verbos":

- select() 	selecciona columnas
- mutate() 	crea nuevas columnas
- filter() 	selecciona filas
- summarise() resume el data.frame (calcula medias, sumas, ...)
- arrange() ordena filas
- slice() selecciona filas por n�mero de fila
- group_by() agrupa filas que compartan valores. Se pueden calcular despu�s medias de grupos, etc.

Usaremos los datos de supervivencia del Titanic: 891 pasajeros, con sus caracter�sticas: sobrevivi�?, clase, nombre, sexo, edad
```{r}
library(titanic)
data("titanic_train")
head(titanic_train)
dim(titanic_train)
```

## Los verbos de dplyr

Nos vamos a quedar primero con las columnas que nos interesen con *select*. Podr�amos usar tambi�n *-Sex* para por ejemplo, quitar la columna *Sex* y dejar las dem�s.

```{r}
library(dplyr)
t_df <- select(titanic_train, Survived, Pclass, Sex, Age, Fare)

head(t_df)

```

Vamos a convertir los dolares del billete a euros con *mutate*. *mutate* modifica columnas existentes, o crea columnas nuevas. En este caso, modificamos la columna ya existente *Fare*)

```{r}
t_df <- mutate(t_df, Fare = Fare * 0.86 )
head(t_df)
```

Podemos quedarnos con una parte del data.frame que cumpla cierta condici�n. Por ejemplo, vamos a seleccionar los pasajeros mujeres que sobrevivieron con *filter*

```{r}
t_mujeres_supervivientes_df <- filter(t_df, Survived==1 & Sex=="female")
head(t_mujeres_supervivientes_df)
```
Podemos usar *summarise* para calcular por ejemplo, la edad media de los pasajeros (y desviaci�n t�pica). Tambi�n creamos una columna. Tambi�n calculamos lo que se gastaron los pasajeros en total en el pasaje.

```{r}
summarise(t_df, edad_media = mean(Age, na.rm=TRUE), desviacion = sd(Age, na.rm=TRUE), euros = sum(Fare))
```

Por �ltimo *group_by*, permite agrupar filas seg�n alg�n criterio, y despu�s hacer operaciones a cada grupo. Vamos a calcular la edad media de las personas que viajaban en el Titanic, pero descomponiendo por hombres y mujeres. Parece que los hombres eran algo m�s mayores que las mujeres y que gastaron algo m�s en el pasaje.

```{r}
t_agrupado_df <- group_by(t_df, Sex)
summarise(t_agrupado_df, edad_media = mean(Age, na.rm=TRUE), desviacion = sd(Age, na.rm=TRUE), euros = sum(Fare))
```
Una caracter�stica interesante de *dplyr* es el uso de la *pipe* o "entubado", mediante el cual podemos concatenar operaciones. Vamos a repetir la operaci�n anterior con *pipes*, representadas por %>%. N�tese que cuando usamos *pipes*, no hace falta poner el primer argumento (el data.frame que se procesa, *t_df* o *t_agrupado_df*). El data.frame digamos que va circulando por la tuber�a.

```{r}
resultado <- t_df %>% 
  group_by(Sex) %>%
  summarise(edad_media = mean(Age, na.rm=TRUE), desviacion = sd(Age, na.rm=TRUE), euros = sum(Fare))

resultado
```

Podemos por �ltimo ordenar el data.frame con *arrange*, por Fare y por Age. Siempre ordena de menor a mayor. Si queremos que vaya al contrario, ponemos *-* delante.

```{r}
ordenado <- arrange(t_df, -Fare, -Age)
head(ordenado)
```

## Algunos ejercicios

Vamos a responder a algunas preguntas usando *dplyr*. Por ejemplo, �cu�ntos hombres y mujeres sobrevivieron? Vemos que sobrevivieron m�s mujeres que hombres.

```{r}
resultado <- t_df %>%
  group_by(Sex) %>%
  filter(Survived == 1) %>%
  summarise(total = n())

resultado
```
Pero, �qu� proporci�n de hombres y mujeres sobrevivi�? Como *Survived* vale 0 o 1, seg�n se sobreviviera, basta con calcular la media de dicho atributo. Vemos que proporcionalmente sobrevivieron m�s las mujeres.

```{r}
resultado <- t_df %>%
  group_by(Sex) %>%
  summarise(media = mean(Survived))

resultado
```
Si queremos desglosar por sexo y edad (suponemos que alguien es un ni�o si tiene menos de 10 a�os). Desgraciadamente, *Age* tiene muchos NA's, as� que los filtramos antes. Vemos que tanto ni�os como ni�as sobrevieron alrededor del 60%.


```{r}
resultado <- t_df %>%
  filter(!is.na(Age)) %>%
  group_by(Sex, Age<=10) %>%
  summarise(media = mean(Survived))

resultado
```
Vamos a ver si hay alg�n patr�n de supervivencia por clase. Parece que los de primera clase tienen la tasa de supervivencia m�s elevada, mientras que de la tercera clase s�lo sobrevivi� un 24%.

```{r}
resultado <- t_df %>%
  group_by(Pclass) %>%
  summarise(media = mean(Survived))

resultado
```
En la misma l�nea, podemos calcular el pasaje medio de los que sobrevivieron y los que no. Vemos que es bastante m�s elevado para los primeros.

```{r}
resultado <- t_df %>%
  group_by(Survived) %>%
  summarise(media = mean(Fare))

resultado
```

