Gói trượt có thể được sử dụng cho việc này. Nó có một giao diện được thiết kế đặc biệt để cảm thấy tương tự như purrr. Nó chấp nhận bất kỳ chức năng tùy ý và có thể trả về bất kỳ loại đầu ra nào. Khung dữ liệu thậm chí được lặp qua hàng khôn ngoan. Trang web pkgdown ở đây .
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
Chi phí hoạt động của cả thanh trượt và data.table frollapply()
phải khá thấp (nhanh hơn nhiều so với sở thú). frollapply()
có vẻ nhanh hơn một chút cho ví dụ đơn giản này ở đây, nhưng lưu ý rằng nó chỉ lấy đầu vào số và đầu ra phải là một giá trị số vô hướng. các hàm trượt hoàn toàn chung chung và bạn có thể trả về bất kỳ loại dữ liệu nào.
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
và nó chứa tất cả các khu phố, không đúng.