Hierfür kann das Slider-Paket verwendet werden. Es hat eine Schnittstelle, die speziell dafür entwickelt wurde, sich ähnlich wie purrr anzufühlen. Es akzeptiert jede beliebige Funktion und kann jede Art von Ausgabe zurückgeben. Datenrahmen werden sogar zeilenweise iteriert. Die pkgdown Seite ist hier .
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
Der Overhead von Slider- und Datentabellen frollapply()
sollte ziemlich gering sein (viel schneller als im Zoo). frollapply()
scheint für dieses einfache Beispiel hier etwas schneller zu sein, aber beachten Sie, dass nur numerische Eingaben erforderlich sind und die Ausgabe ein skalarer numerischer Wert sein muss. Schiebereglerfunktionen sind vollständig allgemein gehalten, und Sie können einen beliebigen Datentyp zurückgeben.
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
und es enthält alle Nachbarschaften, nicht richtig.