5.6 Eficiencia y desfases con dplyr
En la Sección 2.4 se calculó el desfase (lag/lead) de un vector desplazándolo “a mano” en R base. dplyr ofrece las funciones lag() y lead(), que hacen lo mismo con una sintaxis más legible (y son especialmente útiles dentro de mutate(), por ejemplo para calcular incrementos entre observaciones consecutivas):
## [1] NA 1 2 3 4 5 6 7 8 9 10
## [1] 2 3 4 5 6 7 8 9 10 11 NA
¿Tiene esta comodidad algún coste en rendimiento? Comparamos con microbenchmark frente al desplazamiento manual de la Sección 2.4:
library(microbenchmark)
x <- rnorm(1e6)
microbenchmark(
base_r = c(NA, x[-length(x)]),
dplyr_lag = dplyr::lag(x),
times = 20
)## Unit: milliseconds
## expr min lq mean median uq max neval cld
## base_r 6.5569 7.58160 35.19722 15.2558 17.94405 440.0706 20 a
## dplyr_lag 5.9889 6.84205 30.42360 9.3262 15.50945 413.5255 20 a
lag()/lead() están vectorizadas internamente, por lo que su rendimiento es equiparable al del código base equivalente: la sintaxis más uniforme de dplyr no implica aquí una penalización relevante.