################################################## #########INTRODUCCIÓN A R PARTE 2 ################ ################################################## #En este lab vamos a revisar los conceptos básicos de uso del RStudio, #así como el uso de la libraría dplyr mencionados en el #capítulo 2 # EL PAQUETE DPLYR ################## #dplyr es una gramática de manipulación de datos que proporciona un conjunto #consistente de verbos que lo ayudan a resolver los desafíos de manipulación #de datos más comunes #Algunas funciones podrían ser desarrolladas por otras funciones básicas similares, #pero dplyr permite realizar el trabajo en una forma más estadarizada. #Contiene 6 funciones básicas: filter, select, arrange, mutate, summarise group_by #Puede trabajar con datos almacenados en bases de datos y tablas de datos. #Realizar uniones: unión interna, unión izquierda, semiunión, antiunión #dplyr enmascara algunas funciones del paquete plyr, Si si desea utilizar #plyr en conjunto dplyr habrá que cargar (require) plyr primero luego dplyr #Usaremos el dataset hflights son vuelos que salen de dos aeropuertos de Houston #El significado de cada columna puede encontrarse en : url <-"https://cran.r-project.org/web/packages/hflights/hflights.pdf" #Cargamos librerías require(ggplot2 ) require(dplyr) require(hflights) require(tidyverse) require(magrittr) require(forcats) data(hflights) View(hflights) class(hflights) #Dado el tamaño de la data es preferible usar tibbles antes que dataframes #tibbles son mucho más rápidas que data frames flights <- as_tibble(hflights) #Veamos la función filter #Filter permite seleccionar únicamente las filas que contiene ciertos valores #en cada una de sus columnas. f1 <- filter(flights, Month==1, DayofMonth==1) head(f1) #es equivalente a la siguiente función contenida en el paquete base #aunque esta también me permite seleccionar columnas de salida flights[flights$Month==1 & flights$DayofMonth==1, ] #Si queremos seleccionar columnas usaremos la función select #Select permite seleccionar determinadas columnas basado en sus nombres f2 <- dplyr::select(f1, DepTime, ArrTime, FlightNum) head(f2) #Note que en este caso hemos referido explicitamente a la función select de dplyr #esto es porque hay otra función select del paquete ridge con el mismo nombre #El equivalente del paquete base sería flights[, c("DepTime", "ArrTime", "FlightNum")] #Pero la característica más interesante de select es poder seleccionar columnas #mediante funciones meta (algo parecido a SQL) #Note que el ":" nos indica un rango de columnas, mientras contains indica que el #nombre de la variable debe contener la palabra "Taxi" f3 <- dplyr::select(flights, Year:DayofMonth, contains("Taxi"), contains("Delay")) names(f3) #Encadenamiento o Chaining #En realidad esta es una funcionalidad de tidy, a la cual dplyr se adapta bien #Consiste en básicamente pasar el resultado de una función como entrada a otra. #Esto se realiza mediante el operador %>% #El operador inverso %<>% esta definido en el paquete magrittr y permite que #la salida de todo el "tren" de encademamiento vaya a determinado objeto. #Por lo tanto, tidyverse y magritter deben estar en la lista de librerías a cargar #En el siguiente ejemplo se encadena select y filter f4 <- flights %>% dplyr::select(UniqueCarrier, DepDelay) %>% dplyr::filter(DepDelay > 60) f4 %<>% dplyr::select( DepDelay) %>% dplyr::filter(DepDelay > 60) head(f4) #La función arrange permite ordena el dataset flights %>% dplyr::select(UniqueCarrier, DepDelay) %>% dplyr::arrange(DepDelay) flights %>% dplyr::select(UniqueCarrier, DepDelay) %>% dplyr::arrange(desc(DepDelay)) #La función arrange usando el paquete base flights[order(flights$DepDelay), c("UniqueCarrier", "DepDelay")] #La función mutate permite alterar el dataset , por ejemplo crear nuevas variable #cambiar el tipo de variable etc . #Por ejemplo la columna speed no existe y deseamos crearla en función de otras columnas ncol(flights) #numero de columnas del dataset flights %>% dplyr::select(Distance, AirTime) %>% mutate(Speed = Distance/AirTime*60) ncol(flights) #La funcion group_by permite el agrupamiento de fila de acuerdo a cierta condición # se usa comúnmente en conjunto con summarise/summarize para obtener sumarizaciones #parciales #vuelvo a cargar la data flights <- as_tibble(hflights) hflights %>% group_by(Dest) %>% dplyr::summarise(avg_delay = mean(ArrDelay, na.rm=TRUE)) #Note que hemos incluido dplyr antes de summarise, es porque el paquete #plyr contiene otro summarise y los dos paquetes están activos #Con el paquete base usariamos esta función tapply head(with(flights, tapply(ArrDelay, Dest, mean, na.rm=TRUE))) head(aggregate(ArrDelay ~ Dest, flights, mean)) #Contando vuelos por fecha flights %>% group_by(Month, DayofMonth) %>% dplyr::summarise(flight_count = n()) %>% arrange(desc(flight_count)) #Otros ejemplos flights %>% group_by(Dest) %>% dplyr::summarise(flight_count = n(), plane_count = n_distinct(TailNum)) #Uno de los temas que nos topamos comúnmente es el uso de factores. #Una variable del tipo factor es generalmente una variable nominal u ordinal #pero que sirve para categorizar. #si la variable ha sido definida como caracter, debemos convertirla en primer #lugar a un factor, caso contrario, no podrá hacer agrupaciones. #El siguiente ejemplo convierte la columna DayOfWeek a factor data(hflights) View(hflights) hflights$DayOfWeek <- as.factor(hflights$DayOfWeek) #Un factor puede tener varios niveles, en el ejemplo anterior los dias de la #semana 1,2,3... son los distintos niveles de la variable factor DayOfWeek. #Un tema que puede ser confuso en el uso de los niveles es que los factores #se ordenan en la forma en la que se van creando. Si por ejemplo, el primer #día de la semana hubiera sido el 7 , cualquier agrupación que se solicite #en base al día, empezaría por mostrar la agrupación del dia 7 y n o el 1 como #se esperaría. #Para solucionar estos problema existe el paquete forcats. #fct_recode lo que permite es renombrar los niveles a mano. #Toma una secuencia de vectores de caracteres con nombre, donde el nombre indica #el nuevo nivel y el valor indica el nivel anterior. #Los niveles que no se mencionen se dejarán como están. #Ppodemos eliminar niveles nombrándolos como NULL. data(hflights) class(hflights$DayOfWeek) hflights$DayOfWeek <- as.factor(hflights$DayOfWeek) levels(hflights$DayOfWeek) hflights$DayOfWeek <- forcats::fct_recode(hflights$DayOfWeek , "Lunes"="1" ,"Martes"="2", "Miercoles="="3", "Jueves"="4", "Viernes"="5", "Sabado"="6", "Domingo"="7") levels(hflights$DayOfWeek) #fct_relevel #Esta función permite mover el orden de los niveles por ejemplo si quisiera que #el lunes apareciera despues del martes data(hflights) View(hflights) hflights$DayOfWeek <- as.factor(hflights$DayOfWeek) levels(hflights$DayOfWeek) hflights$DayOfWeek <- fct_relevel(hflights$DayOfWeek, "1", after=2) levels(hflights$DayOfWeek) #Hay veces que el ordenamiento de un factor estará dado por otra variable o #columna la función fct_reorder() permite reordenar los niveles de los factores #ordenándolos a lo largo de otra variable. Esto es útil cuando queremos #graficar una variable categórica, pero queremos que el ordenamiento sea #en base a valores de otra variable #Veamos un ejemplo chks <- subset(ChickWeight, as.integer(Chick) < 10) chks <- transform(chks, Chick = fct_shuffle(Chick)) ggplot(chks, aes(Time, weight, colour = Chick)) + geom_point() + geom_line() ggplot(chks, aes(Time, weight, colour = fct_reorder2(Chick, Time, weight))) + geom_point() + geom_line() + labs(colour = "Chick")