Los pipes o tuberías (me suena fatal) están presentes en casi todos los lenguajes de programación, permiten encadenar una serie de procesos conectados de forma que la salida de uno alimenta la entrada del siguiente y facilita la legibilidad.
Este es un ejemplo básico usando la línea de comandos y el comando pipe |
en Linux, listamos el contenido de un directorio, del resultado obtenemos los 3 primeros archivos y a continuación el último elemento con tail
de esos tres:
$ ls | head -3 | tail -1
Creo que el paquete base de R no incluye un operador para crear pipes, pero R son sus paquetes y existen varios con este propósito.
Operadores de pipe con el paquete magrittr
En este PDF está la referencia completa del paquete descargada de este enlace.
El operador más usado es %>%
, hacer esto c(1,3,4) %>% mean()
es equivalente a mean(c(1,3,4))
.
Para una función que acepta varios parámetros hacer x %>% f(y)
es equivalente a f(x, y)
.
Podemos usar el operador varias veces,x %>% f %>% g %>% h
es equivalente a h(g(f(x)))
.
A continuación genero una muestra aleatoria de 10 números usando la función de distribución normal rnorm
, calculo la media y la redondeo:
x <- 10
x %>% rnorm() %>% mean() %>% round()
Otro ejemplo creando un diagrama con la función plot
:
rnorm(100) %>% plot
Comandos adicionales
A pesar de que el operador %>%
es el más usado del paquete magrittr este ofrece otros.
El operador %<>%
ejecuta el pipe y vuelve a asignar el valor a la variable:
x <- rnorm(100)
x %<>% abs %>% sort
El operador tee %T>%
se usa para devolver el valor original en vez del resultado (se lo llama “T” porque literalmente tiene la forma de una T).
rnorm(100) %>%
matrix(ncol = 2) %T>%
plot() %>%
str()
La expresión de arriba solo formada por %>%
hubiese retornado NULL (pruébalo).
El operador %$%
se usa para exponer los nombres de las variables y hacer referencia a ellas, uso el dataset mtcars para buscar la correlación entre dos de sus variables con la función estadística cor
.
mtcars %$%
cor(disp, mpg)
Ejemplos
Ahora cargo el paquete dplyr que ofrece funciones de manipulación de datos y además incluye un dataset “storms” con datos de tormentas que usaré de ejemplo.
Uso el pipe para seleccionar dos variables del dataset usando select
:
storms %>% select(wind,pressure)
Filtro el dataset usando un valor de una variable como condición con filter
:
storms %>% filter(wind>=50)
Si encadeno varios operaciones se ve el potencial de los pipes:
storms %>%
filter(wind>=50) %>%
select(wind, pressure)
Atajo de teclado para escribir el operador %>%
:
[Fuente]
Este ejemplo también es muy interesante, aplica varios pipes para obtener primero un subconjunto del dataset iris basado en los valores de una variable que cumplen una condición con subset
, después con el subconjunto obtenido aplico aggregate
para obtener subconjuntos agrupados por especies y calculo la media de las variables:
> iris %>%
+ subset(Sepal.Length > 5) %>%
+ aggregate(. ~ Species, ., mean)
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.313636 3.713636 1.509091 0.2772727
2 versicolor 5.997872 2.804255 4.317021 1.3468085
3 virginica 6.622449 2.983673 5.573469 2.0326531
El “.” se usa para indicar donde se usa el argumento recibido por el pipe (argument placeholder).
Paquete pipeR
El paquete pipeR introduce el operador %>>%
:
rnorm(100) %>>%
plot(col="red")
Como antes Usamos “.” para posicionar el argumento:
rnorm(100) %>>%
plot(col="red", main=length(.))
La función Pipe crea un objeto que almacena un dato y permite concatenar comandos con $
(Object-based pipeline).
Pipe(rnorm(100))$mean()
Código fuente
- r / intro /55-R-pipes / pipes.R.
Enlaces internos
Enlaces externos
- rdocumentation.org “Pipe”: Create a Pipe object that stores a value and allows command chaining with $.
- rsanchezs.gitbooks.io “El operador pipe %>%”: De este manual Web he obtenido los ejemplos de pipes con dplyr y el dataset storms.
- datacamp.com “Pipes in R Tutorial For Beginners”: Excelente resumen sobre pipes y de donde he sacado algunos ejemplos.
- magrittr.tidyverse.org “magrittr - Overview”.