Można do tego użyć pakietu suwaka. Ma interfejs, który został specjalnie zaprojektowany, aby przypominał mruczenie. Przyjmuje dowolną funkcję i może zwrócić dowolny typ wyniku. Ramki danych są nawet iterowane względem wiersza. Strona pkgdown jest tutaj .
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
Obciążenie zarówno suwaka, jak i tabeli danych frollapply()
powinno być dość niskie (znacznie szybsze niż zoo). frollapply()
wygląda na to, że jest nieco szybszy w tym prostym przykładzie tutaj, ale należy pamiętać, że wymaga on tylko wprowadzania liczbowego, a wynik musi być skalarną wartością liczbową. funkcje suwaka są całkowicie ogólne i można zwrócić dowolny typ danych.
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
i zawiera całą okolicę, nie w porządku.