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):

a <- 1:11
dplyr::lag(a)
##  [1] NA  1  2  3  4  5  6  7  8  9 10
dplyr::lead(a)
##  [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.