Пакет слайдера может быть использован для этого. Он имеет интерфейс, который был специально разработан, чтобы чувствовать себя похожим на мурлыканье. Он принимает любую произвольную функцию и может возвращать любой тип вывода. Кадры данных даже повторяются по строкам. Сайт 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
Затраты как на слайдер, так и на data.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
и он содержит все окрестности, не так.