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