Для цього можна використовувати повзунковий пакет. Він має інтерфейс, який був спеціально розроблений, щоб відчувати себе схожим на purrr. Він приймає будь-яку довільну функцію і може повертати будь-який тип виводу. Кадри даних навіть повторені за рядками. Сайт pkgdown тут .
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
Накладні витрати як на слайдер, так і на дані.table frollapply()
мають бути досить низькими (набагато швидшими, ніж у зоопарку). frollapply()
Здається, цей простий приклад трохи швидше, але зауважте, що він приймає лише числове введення, а вихід повинен бути скалярним числовим значенням. Функції слайдера повністю загальні, і ви можете повернути будь-який тип даних.
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
і він містить все сусідство, не так.