O pacote deslizante pode ser usado para isso. Ele tem uma interface que foi projetada especificamente para parecer semelhante ao ronronar. Ele aceita qualquer função arbitrária e pode retornar qualquer tipo de saída. Os quadros de dados são ainda iterados em linhas. O site pkgdown está aqui .
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
A sobrecarga do controle deslizante e da tabela data.t frollapply()
deve ser bem baixa (muito mais rápida que o zoo). frollapply()
parece ser um pouco mais rápido para este exemplo simples aqui, mas observe que são necessárias apenas entradas numéricas e a saída deve ser um valor numérico escalar. As funções do controle deslizante são completamente genéricas e você pode retornar qualquer tipo de dados.
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 ele contém toda a vizinhança, não está certo.