Le package slider peut être utilisé pour cela. Il a une interface qui a été spécialement conçue pour se sentir similaire à purrr. Il accepte n'importe quelle fonction arbitraire et peut renvoyer n'importe quel type de sortie. Les trames de données sont même itérées par ligne. Le site de pkgdown est ici .
library(slider)
x <- 1:3
# Mean of the current value + 1 value before it
# returned as a double vector
slide_dbl(x, ~mean(.x, na.rm = TRUE), .before = 1)
#> [1] 1.0 1.5 2.5
df <- data.frame(x = x, y = x)
# Slide row wise over data frames
slide(df, ~.x, .before = 1)
#> [[1]]
#> x y
#> 1 1 1
#>
#> [[2]]
#> x y
#> 1 1 1
#> 2 2 2
#>
#> [[3]]
#> x y
#> 1 2 2
#> 2 3 3
La surcharge du curseur et de la table data.table frollapply()
devrait être assez faible (beaucoup plus rapide que zoo). frollapply()
semble être un peu plus rapide pour cet exemple simple ici, mais notez qu'il ne prend qu'une entrée numérique et que la sortie doit être une valeur numérique scalaire. Les fonctions de curseur sont complètement génériques et vous pouvez renvoyer n'importe quel type de données.
library(slider)
library(zoo)
library(data.table)
x <- 1:50000 + 0L
bench::mark(
slider = slide_int(x, function(x) 1L, .before = 5, .complete = TRUE),
zoo = rollapplyr(x, FUN = function(x) 1L, width = 6, fill = NA),
datatable = frollapply(x, n = 6, FUN = function(x) 1L),
iterations = 200
)
#> # A tibble: 3 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 slider 19.82ms 26.4ms 38.4 829.8KB 19.0
#> 2 zoo 177.92ms 211.1ms 4.71 17.9MB 24.8
#> 3 datatable 7.78ms 10.9ms 87.9 807.1KB 38.7
forecast::ma
et il contient tout le quartier, pas bien.