7 {tidyr}

Contiene funciones para re-estructurar dataframes. Similar al conocido “transponer” de excel.

(fig/tidyr-pivot_wider_longer.gif)

7.1 pivot_longer()

Por lo general en la etapa de toma de datos en el campo/lab (y su consiguiente pasaje a planilla electrónica, Excel) nos resulta más cómodo que las planillas de papel tengan un formato wide.

En muchas ocasiones necesitamos (para graficar o modelar) que nuestros datos estén en formato long.

La función pivot_longer apila las columnas que indiquemos, re-arregando los datos de un formato “wide” a “long”:

Importemos soja

soja  <- rio::import("data/datos_curso.xls", sheet ="soja")
soja

En este caso necesitamos generar una columna bk y yield, o sea, tornar soja de “wide” a “long”:

soja %>% 
  pivot_longer(cols=c(bk_1, bk_2, bk_3, bk_4), # contains("_") # bk_1:bk_4
               names_to = "bk", 
               values_to = "yield", 
               names_prefix = "bk_") -> soja_long 

Tambien es comun para medidas repetidas en el tiempo

canola  <- rio::import("data/datos_curso.xls", sheet ="canola")
canola
canola %>%  
  pivot_longer(
    cols=contains("_"),
    names_to = "tt",
    values_to = "inc", 
    names_prefix = "inc_")-> can_long

can_long
str(can_long)
can_long %>% 
  mutate_at("tt", as.numeric) %>% 
  ggplot()+
  aes(x=tt, y=inc, group=1)+
  geom_line() + 
  facet_grid(bk ~ trt)

7.2 unite()

can_long %>% 
  unite(col="par", bk, trt, sep = "_", remove = FALSE) -> can_long2

can_long2 %>% 
  mutate_at("tt", as.numeric) %>% 
  ggplot()+
  aes(x=tt, y=inc, group=1)+
  geom_line() + 
  facet_wrap("par")
bce_full %>% 
  select(date, tmean, rad, pp) %>% 
  pivot_longer(cols = -date, 
               names_to = "var", 
               values_to = "val") -> bce_full_long 
bce_full_long 
# bce_full_long %>% 
  # mutate(
  #   var= fct_recode(var,
  #                       "Radiation (Mj/m2)" ="rad", 
  #                       "Mean Temperature (ºC)"="tmean", 
  #                       "Precipitation (mm)"="pp") 
  # ) %>% 

ggplot(bce_full_long) + 
  aes(x = date, y = val) +  
  geom_line(data = subset(bce_full_long, var!="pp")) + 
  geom_col(data = subset(bce_full_long, var=="pp")) + 
  facet_grid(var~., scales = "free") + 
  scale_x_date(date_breaks = "1 month", date_labels = "%b")+ 
  theme_bw() + 
  theme(axis.text.x = element_text(angle=45, hjust = 1))  + 
  labs(x="", y="")