Il pacchetto slider può essere utilizzato per questo. Ha un'interfaccia che è stata appositamente progettata per sembrare simile a Purrr. Accetta qualsiasi funzione arbitraria e può restituire qualsiasi tipo di output. I frame di dati sono persino ripetuti su righe. Il sito pkgdown è qui .
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
Il sovraccarico di slider e data.table frollapply()
dovrebbe essere piuttosto basso (molto più veloce dello zoo). frollapply()
sembra essere un po 'più veloce per questo semplice esempio qui, ma nota che richiede solo input numerici e che l'output deve essere un valore numerico scalare. le funzioni di scorrimento sono completamente generiche ed è possibile restituire qualsiasi tipo di dati.
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
e contiene tutto il vicinato, non giusto.