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
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))
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 .
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
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))