6.3 Pipelines con tidyverse
Cuando se inicia en el lenguaje de R, la manera intuitiva de aplicar secuencialmente varias funciones a una base de datos puede lucir así:
<- Funcion1(BASE_DE_DATOS)
Res1 <- Funcion2(Res1)
Res1 <- Funcion3(Res2) Res3
Pero existe un concepto para explorar en este contexto: anidar variables. Implica colocar funciones una dentro de otra de manera que la aplicación se hace de adentro hacia afuera: sobre BASE_DE_DATOS
se aplicará Funcion1()
; al resultado de ella, se aplicará Funcion2()
; y al siguiente resultado, Funcion3()
.
Funcion3(Funcion2(Funcion1(BASE_DE_DATOS)))
Los programadores de la librería magrittr diseñaron un operador llamado pipe, en Español tubo, %>%
. Este permite ir pasando el resultado de una función como primer argumento (o argumento de data
) de la siguiente función. Este sencillo operador mejora enormemente la lectura y compresión del código, haciéndolo incluso más elegante. Con pipe, el ejemplo secuencial explicado arriba se convierte en:
# Pipeline
%>%
BASE_DE_DATOS Funcion1() %>%
Funcion2() %>%
Funcion3()
La gran ventaja es que tidyverse ha sido diseñado en torno a la creación de pipelines, en Español tuberías. Siendo que todo se simplifica para su uso con estas librerías y otras que sean consideradas pipe-friendly, como rstatix. A lo largo del capítulo, se irá aplicando el concepto de tuberías para que te familiarices con su uso.
Como un ejemplo definitivo, así es como se crean pipelines que generen gráficos con ggplot2 y dplyr:
# Cargar la base de datos Boston
library(MASS)
data("Boston")
# Pipeline
%>%
Boston filter(rad %in% 1:3 & zn != 0) %>%
group_by(tax) %>%
summarise(age_promedio = mean(age),
rad = unique(rad)) %>%
mutate(tax = paste0("N_",tax),
tax = as.factor(tax),
rad = as.factor(rad)) %>%
ggplot(aes(x=reorder(tax, age_promedio), y=age_promedio, fill=rad))+
geom_bar(stat="identity")+
geom_text(aes(label=round(age_promedio,2)), color ="white",
hjust = 1.1)+
scale_y_discrete(expand = c(0,0,0,10))+
scale_fill_manual(values = colorPal)+
labs(x="Nivel de Tax", y="Edad promedio", fill="Grupo",
title = "Edad promedio por nivel de Tax",
subtitle = "Datos obtenidos de Boston (1969)")+
coord_flip()+
theme_minimal()+
theme(legend.position = "bottom",
axis.ticks.length.y = unit(0, "cm"),
legend.key.height = unit(0.2,"cm"),
legend.key.width = unit(1.5, "cm"),
title = element_text(face = 2))
Figura 6.11: Ejemplo de código con ggplot2 y dplyr utilizando una pipeline.