इसके लिए स्लाइडर पैकेज का उपयोग किया जा सकता है। इसका एक इंटरफ़ेस है जिसे विशेष रूप से 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
स्लाइडर और 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
और इसमें सभी पड़ोस शामिल हैं, न कि सही।