library(tidyverse) library(datos) ## Objetivos: # Cada variable del problema es una columna # Cada observación del problema es una fila # Cada valor medido va en una entrada del dataframe tabla1 tabla2 tabla3 tabla4a tabla4b # tabla1 está en el formato que queremos. tabla1 %>% mutate(tasa = casos / poblacion * 10000) tabla1 %>% count(anio, wt = casos) # La variable 'anio' de tabla4a está dividida en 2 columnas tabla4a %>% pivot_longer(cols = c(`1999`, `2000`), names_to = "anio", values_to = "casos") # 'gather' y 'pivot_longer' hacen lo mismo # Similar para tabla4b tabla4b %>% pivot_longer(cols = c(`1999`, `2000`), names_to = "anio", values_to = "poblacion") # Necesitaríamos ahora juntar la info de ambas tablas para recuperar tabla1 # Estudiaremos eso en el siguiente capítulo # Para el proceso inverso, tenemos 'pivot_wider' tabla2 %>% pivot_wider(names_from = tipo, values_from = cuenta) # Si tenemos una variable para la que queremos separar sus valores en dos columnas, # disponemos de 'separate' tabla3 %>% separate(tasa, into = c("casos", "poblacion")) # observemos que la conversión a integer no se hizo automáticamente tabla3 %>% separate(tasa, into = c("casos", "poblacion"), sep = '/', convert = TRUE) # Puede parecer sorprendente, pero 'separate' es útil en muchas situaicones tabla3 %>% separate(anio, into = c("siglo", "anio"), sep = 2) # valores positivos de 'sep' para contar desde el principio # valores negativos de 'sep' para contar desde el final tabla5 # El "opuesto" a 'separate' es 'unite'. Su uso en la vida real es menos frecuente tabla5 %>% unite(nueva, siglo, anio) tabla5 %>% unite(nueva, siglo, anio, sep = "") %>% mutate(nueva = as.integer(nueva)) # Hay que tener cuidado al tratar valores faltantes: # Un 'NA' indica que falta un valor # Pero puede faltar una fila entera, y si no tenemos cuidado, no nos enteramos acciones <- tibble( anio = c(2015, 2015, 2015, 2015, 2016, 2016, 2016), trimestre = c(1, 2, 3, 4, 2, 3, 4), retorno = c(1.88, 0.59, 0.35, NA, 0.92, 0.17, 2.66) ) acciones # Hay un 'NA' en la fila 4 # Pero también falta el primer semestre de 2016! acciones %>% complete(anio, trimestre) # 'complete' completa todas las combinaciones de 'anio' y 'trimestre' # Una versión larga de lo anterior puede hacerse pivoteando acciones %>% pivot_wider(names_from = anio, values_from = retorno) %>% pivot_longer( cols = c(`2015`, `2016`), names_to = "anio", values_to = "retorno" ) # Para casos donde el valor faltante se da por sobreentendido, contamos con 'fill' tratamiento <- tribble( ~sujeto, ~tratamiento, ~respuesta, "Derrick Whitmore", 1, 7, NA, 2, 10, NA, 3, 9, "Katherine Burke", 1, 4 ) tratamiento tratamiento %>% fill(sujeto)