--- 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 ```