# ============================================================================== # Tidy data # ============================================================================== library(tidyverse) library(ggplot2) # Los 3 simples principios para que una data este estructura de forma tidy # Primero: cada columna es una variable (i.e. variable edad) # Segundo: cada fila es una observación (i.e. pasajero del titanic) # Tercero: cada celda es un valor (intersección entre fila y una columna) # esto es para crear mi data de ejemplo, esta data representa la rentabilidad # de la bolsa chilena por mes y año toy <- as_tibble(matrix(rnorm(120), nrow = 12)) names(toy) <- paste("anho", 2009:2018, sep = "_") # pueden ver el ejemplo llamando a toy en la consola (toy <- toy %>% mutate(mes = 1:12) %>% select(mes, everything())) # Es tidy la data toy? NO! podemos encontrar la variable año no en una sola # columna, sino que encontramos los VALORES de la variable año desparramados # en los nombres de las columnas (2008, 2009, ...). Es decir, el primer principio # de una estructura tidy se viola. ¿Cómo podemos identificar este problema? Nos # tenemos que preguntar...todas las variables son una columna? # Es importante diferenciar que nuestra estructura ideal (tidy) es que las variables # sean columnas, esto no hace que una columna sea una variable per se como en # el caso de arriba. # para pasar nuestro ejemplo toy a estructura tidy utilizamos la función # gather() del paquete tidy tidy_toy <- tidyr::gather(data = toy, key = "anho", value = "rentabilidad_bolsa", -mes) # key contiene el nombre que le damos a la variable que esta desparramada en # los nombres de las columnas, en este caso año (no ocupo la ñ en vez uso nh), # luego value tendra el nombre de los valores que son las rentabilidades. Y # finalmente, le decimos a gather() que la columna mes no tiene que ser tratada # porque esta columna sí es una variable, entonces utilizamos - mes para que no # sea procesada # vean la diferencia View(tidy_toy) # La operación inversa...esta forma es útil para crear una tabla de # publicación siempre y cuando no haya tantos valores tidyr::spread(tidy_toy, key = "anho", value = "dato") # ============================================================================== # Repensar la estructura en que se encuentra nuestros datos. # ============================================================================== df <- as_tibble(iris) df <- select(df, Species, ends_with("Length"), ends_with("Width")) # Graficar largo v/s ancho de sepal por especie de planta ggplot(df) + geom_point(aes(Sepal.Length, Sepal.Width, colour = Species)) # Ahora, si les pregunta que quiero gráficar largo y ancho # separado por grupo "Petal" y "Sepal" glimpse(df) # Creemos un identificar para cada observación (df <- df %>% mutate(id = row_number()) %>% select(id, everything())) # Notamos que la misma información se puede estructura de distintas maneras. Esto # tiene impacto en como pensamos y operamos los datos long_df <- tidyr::gather(df, key = "medida", value = "valor", -Species, - id) # Veamos las distintas medidas long_df %>% distinct(medida) # Separemos la columna medida en dos columnas una que contenga "parte_planta" y # otra que contenga "variable_medida" long_df <- tidyr::separate(long_df, medida, into = c("parte_planta", "variable_medida"), sep = "\\.") # visualicen como queda.. View(arrange(long_df, id)) # es tidy esta data?... NO!. Hay otra tipico error de forma NO tidy que es # cuando una variable esta en más de una observación en las filas. Es decir, # se viola el principio 2 de que cada fila es una observación. # En este caso, cada observación se repite dos veces para registrar una medida # de una variable distintas. Tenemos que pasar la columna que contiene las variables # en sus valores a que cada valor tome una columna separada. Es decir, cada # columna es una variable. Ocupamos spread para que los valores de la columna # variable_medida que contiene variables en sus valores se extiendan # en columnas independientes: tidy_df <- tidyr::spread(long_df, key = variable_medida, value = valor) View(tidy_df) # Ahora, si queremos graficar largo y archo separado por petal y sepal, podemos # incorporar información que antes estaba encubierta en una estructura que no # era acorde para las herramientas que utilizamos (i.e. ggplot2, dplyr, etc) ggplot(tidy_df) + geom_point(aes(Length, Width, colour = parte_planta, shape = Species))