Este paquete agrupa una serie de paquetes que tienen una misma lógica en su diseño y por ende funcionan en armonía. Entre ellos usaremos principalmente para realizar gráfico, y y para realizar transformaciones sobre nuestro set de datos.

A continuación cargamos la librería a nuestro ambiente. Para ello deben estar previamente instalada en nuestra pc.

library(tidyverse)
library(lubridate)
Para mostrar el funcionamiento básico del tidyverse, realizamos el siguiente ejemplo.
INDICE <- c(100, 100, 100, 101.8, 101.2, 100.73, 102.9, 102.4, 103.2)

FECHA  <- c("Oct-16", "Oct-16", "Oct-16", "Nov-16",
            "Nov-16", "Nov-16", "Dec-16", "Dec-16",
            "Dec-16") 

GRUPO  <- c("Privado_Registrado","Público", "Privado_No_Registrado",
            "Privado_Registrado", "Público", "Privado_No_Registrado",
            "Privado_Registro", "Público", "Privado_No_Registrado")
            
Datos  <- data.frame(INDICE, FECHA, GRUPO)
Permite ver la estructura de la tabla. Nos muestra:
glimpse(Datos)
## Rows: 9
## Columns: 3
## $ INDICE <dbl> 100.00, 100.00, 100.00, 101.80, 101.20, 100.73, 102.90, 102.40,…
## $ FECHA  <chr> "Oct-16", "Oct-16", "Oct-16", "Nov-16", "Nov-16", "Nov-16", "De…
## $ GRUPO  <chr> "Privado_Registrado", "Público", "Privado_No_Registrado", "Priv…

Permite filtrar la tabla de acorde al cumplimiento de condiciones lógicas.

Datos %>% filter(INDICE>101, GRUPO=="Privado_Registrado")

Nótese que en este caso al separar con una (coma), las condiciones se exige el cumplimiento de ambas. En caso de desear que se cumpla una sola condición debe utilizarce el caracter |.

Datos %>% 
  filter(INDICE>101 | GRUPO == "Privado_Registrado")

Permite renombrar una columna de la tabla. Funciona de la siguiente manera:

Datos %>% 
  rename(Periodo=FECHA)

Nótese que a diferencia del ejemplo de la función donde utilizábamos \(==\) para comprobar una condición lógica, en este caso se utiliza sólo un \(=\) ya que lo que estamos haciendo es asignar un nombre.

Permite agregar una variable a la tabla (especificando el nombre que tomará esta), que puede ser el resultado de operaciones sobre otras variables de la misma tabla.

En caso de especificar el nombre de una columna existente, el resultado de la operación realizada “sobrescribirá” la información de la columna con dicho nombre.

Datos <- Datos %>%
  mutate(Doble=INDICE*2)
Datos
Permite definir una variable, la cual toma un valor particular para cada condición establecida. Los valores asignados deber ser siempre del mismo tipo (numerico, caracter, lógico, etc) En caso de no cumplir ninguna de las condiciones establecidas la variable tomara el valor

La sintaxis de la función es case_when(condición lógica ~ valor asignado 1).

Datos <- Datos %>%
  mutate(Caso_cuando = case_when(GRUPO=='Privado_Registrado' ~ INDICE*2, GRUPO=='Público'~ INDICE*3))
Datos

Una forma de manejar la asignación de valores faltantes es crear una condición que sea igual a TRUE. Esto funciona como la parte de de una estructura condicional.

Datos %>% 
  mutate(Caso_cuando = case_when(GRUPO=='Privado_Registrado' ~ INDICE*2, GRUPO=='Público' ~ INDICE*3,
                                 TRUE ~ 1000))

Permite especificar la sere de columnas que se desea conservar de un DataFrame. También pueden especificarse las columnar que desean descartar (agregandoles un -). Muy útil para agilizar el trabajo en bases de datos de gran tamaño.

Datos2 <-  Datos %>% 
 select(INDICE,FECHA,GRUPO)
Datos2
Datos <- Datos %>%
  select(-c(Doble, Caso_cuando))
Datos

Permite ordenar la tabla por los valores de determinada/s variable/s. Es útil cuando luego deben hacerse otras operaciones que requieren del ordenamiento de la tabla.

Datos <- Datos %>%
  arrange(GRUPO, INDICE)
Datos

Crea una nueva tabla que resuma la información original. Para ello, definimos las variables de resumen y las formas de agregación.

Datos %>% 
  summarise(Indprom=mean(INDICE))

Esta función permite realizar operaciones de forma agrupada. Lo que hace la función es a la tabla según los valores de la variable indicada y realizar las operaciones que se especifican a continuación, de manera independiente para cada una de las . En nuestro ejemplo sería útil para calcular el promedio de los indices pro FECHA.

Datos %>% 
  group_by(FECHA) %>%
  summarise(Indprom=mean(INDICE))
El paquete esta pensado para facilitar el emprolijamiento de los datos.

es una función que nos permite pasar los datos de forma horizontal a una forma vertical.

es una función que nos permite pasar los datos de forma vertical a una forma horizontal.

#Utilzamos un conjunto de datos que viene con la librería datasets

library(datasets)

data(iris)
iris <- iris %>%
  mutate(id=1:nrow(.)) %>% #le agrego un ID
  select(id, everything()) # lo acomodo para que el id este primero.

head(iris)
iris_vertical <- iris %>% gather(., #el. llama a lo que esta atras del %>%
                                 key = variables,
                                 value = valores,
                                 2:5) # le indico que  columnas juntar

head(iris_vertical)

Podemos deshacer el con un Spread

iris_horizontal <- iris_vertical %>% 
  spread(. , 
         key = variables, # la llave es la variable que va a dar los nombres de columna
         value = valores) # los valores con que se llenan las celdas
head(iris_horizontal)

El paquete lubridate está pensado para trabajar con los datos tipo fecha (date) o fecha-hora(datetime) para cambiarles el formato, realizar operaciones y extraer información

Existe una gran cantidad de funciones para realizar esto. La idea general es poder llevar los objetos datetime a un formato común compuesto de los elementos: año, mes, dia, hora, minuto y segundo (también se puede setear el uso horario)

fecha <- "04/12/92 17:35:16"
fecha
## [1] "04/12/92 17:35:16"

Con la función dmy_hms podemos convertir este string a una fecha: estamos indicando que el formato de la fecha es día(d), mes(m), año(y), hora(h), minutos(m) y segundo(s)

fecha <- dmy_hms(fecha)
fecha
## [1] "1992-12-04 17:35:16 UTC"

Otra función para realizar un cambio de formato es parse_date_time. Permite construir objetos datetime a partir de datos más complejos, como por ejemplo cuando aparece el nombre del mes y el año.

fecha2 <- 'Dec-92'
fecha2 <- parse_date_time(fecha2, orders = 'my')
fecha2
## [1] "1992-12-01 UTC"
ggplot tiene una sintaxis propia. La idea central es pensar los gráficos como una sucesion de capas, que se construyen una a la vez.

ggplot tiene muchos comandos, y no tiene sentido saberlos de memoria, es siempre útil reutilizar gráficos viejos y tener a mano el .

Limpieza de Datos

La limpieza de los datos en R es fundamental para realizar cualquier análisis. Cualquiera que sea la información que tenga, ya se a partir de mediciones tomadas en el campo o extraidas de la web , es muy probable que tenga que tenga que remodelar, transformala o filtrarla para que sea adecuada para su análisis.

pew <- read_delim("http://stat405.had.co.nz/data/pew.txt", "\t", 
  escape_double = FALSE, trim_ws = TRUE)
## Rows: 18 Columns: 11── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr  (1): religion
## dbl (10): <$10k, $10-20k, $20-30k, $30-40k, $40-50k, $50-75k, $75-100k, $100...
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
pew
Esta base de datos tiene 3 variables: religión, ingreso y frecuencia. Para limpiarla es necesario apilar las columnas (alargar los datos). Notemos que al alargar los datos desapareceran las columnas que se agrupan y dan lugar a dos nuevas columnas: la correspondiente a clave y la correspondiente a valor. Entonces, para alargar una base de datos usamos la función que recibe los argumentos:
pew_tidy <- gather(data = pew, income, frequency, -religion)
pew_tidy

La nueva estructura de la base de datos nos permite, por ejemplo, hacer fácilmente una gráfica donde podemos comparar las diferencias en las frecuencias.

ggplot(pew_tidy, aes(x = income, y = frequency, color = religion, group = religion)) +
  geom_line() + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Podemos hacer gráficas más interesantes si creamos nuevas variabes:

by_religion <- group_by(pew_tidy,religion)
pew_tidy_2  <- pew_tidy %>% 
  filter(income != "Don't know/refused") %>%
  group_by(religion) %>%
  mutate(percent=frequency /sum(frequency)) %>%
  filter(sum(frequency)>1000)

head(pew_tidy_2)
income_levels <- unique(pew_tidy$income)[1:9]
ggplot(pew_tidy_2, aes(x=income, y=percent, group=religion))+facet_wrap(~ religion, nrow=1)+
  geom_bar(stat='identity', fill="darkgray") + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) + 
  scale_x_discrete(limits=income_levels)

Otro ejemplo, veamos los datos de Billboard, aquí se registra la fecha en la que una canción entra por primera vez al top 100 de Billboard.

billboard <- read_csv("billboard.csv")
## Rows: 317 Columns: 83── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr   (4): artist.inverted, track, time, genre
## dbl  (66): year, x1st.week, x2nd.week, x3rd.week, x4th.week, x5th.week, x6th...
## lgl  (11): x66th.week, x67th.week, x68th.week, x69th.week, x70th.week, x71st...
## date  (2): date.entered, date.peaked
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Notemos que el rank en cada semana (una vez que entró a la lista) está guardado en 75 columnas wk1 a wk75, este tipo de almacenamiento no es limpio pero puede ser útil al momento de ingresar la información.

Para tener datos limpios apilamos las semanas de manera que solo sea una columna (nuevamente alargamos los datos)

billboard_long <- gather(billboard, week, rank, x1st.week:x76th.week, na.rm = TRUE)
billboard_long

Notemos que en esta ocasión especificamos las columnas que vamos a apilar indicando el nombre de la primera de ellas seguido de : y por último el nombre de la última variable a apilar. Por otra parte, la instrucción na.rm=TRUE se utiliza para eliminar los renglones con valores faltantes en la columna de value(rank), es es, eliminamos aquellas observaciones que tenían NA en las columnas wknum de la tabla ancha. Ahora realizamos una limpieza adicional creando mejores variables de fecha.

billboard_tidy <- billboard_long %>% 
  mutate(
    week = parse_number(week),
    date = date.entered + 7*(week-1),
    rank = as.numeric(rank)
  ) %>%
  select(-date.entered)
billboard_tidy

Nuevamente, podemos hacer gráficas facilmente.

tracks <- filter(billboard_tidy, track %in% 
    c("Higher", "Amazed", "Kryptonite", "Breathe", "With Arms Wide Open"))

ggplot(tracks, aes(x = date, y = rank)) +
  geom_line() + 
  facet_wrap(~track, nrow = 1) + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1))