【发布时间】:2021-12-08 11:24:51
【问题描述】:
以下是我尝试的最小可重现示例。简要说明,我使用 rowr 包中的 rollApply 来计算滚动窗口上的函数,并同时使用两列中的数据。如果可能的话,我想在每次在新窗口上计算函数时跳过 n 步。我将尝试在下面的示例中阐明我的意思。
这是示例数据:
df1 <- tibble(
x = c(1:9),
y = c(1:9),
Date = as.Date(c("2015-08-08", "2015-08-15", "2015-08-22",
"2015-08-29","2015-09-05", "2015-09-12", "2015-09-19",
"2015-09-26", "2015-10-03"))
)
以下是示例函数:
calc_ex <- function(y){
sum(y[,1] + y[,2])
}
roll_calc_ex <- function(y){
vec <- c(rep(NA, 2), rowr::rollApply(y, calc_ex, window = 3, minimum = 3))
y <- y %>%
mutate(estimate = vec)
return(y)
}
将函数roll_calc_ex()应用于df1,得到如下输出:
> roll_calc_ex(df1)
# A tibble: 9 x 4
x y Date estimate
<int> <int> <date> <int>
1 1 1 2015-08-08 NA
2 2 2 2015-08-15 NA
3 3 3 2015-08-22 12
4 4 4 2015-08-29 18
5 5 5 2015-09-05 24
6 6 6 2015-09-12 30
7 7 7 2015-09-19 36
8 8 8 2015-09-26 42
9 9 9 2015-10-03 48
理想情况下,我希望有一个滚动窗口跳过 n 步,例如 n=2,以产生以下输出:
# A tibble: 9 x 4
x y Date estimate
<int> <int> <date> <int>
1 1 1 2015-08-08 NA
2 2 2 2015-08-15 NA
3 3 3 2015-08-22 12
4 4 4 2015-08-29 NA
5 5 5 2015-09-05 NA
6 6 6 2015-09-12 30
7 7 7 2015-09-19 NA
8 8 8 2015-09-26 NA
9 9 9 2015-10-03 48
或者,不是为跳过的每一行返回 NA,而是可以填充先前计算的数字(我计划稍后使用 tidyverse 中的 fill() 来做)。
如果可以使用 zoo 包中的 rollapply() 来解决这个问题,那也很有趣。我只使用 rowr::rollApply() 因为我需要将该函数同时应用于两列。我知道可以使用“runner”包中的 runner(),但在我更复杂的问题中,我需要运行并行计算。我正在使用 furrr 包进行并行化,我的代码适用于 rollApply,但不适用于 runner()。这里解释了我遇到的跑步者问题:Problem with parallelization using furrr [and runner::runner() ] in R。
感谢所有花时间阅读这篇文章的人。任何帮助将不胜感激。
【问题讨论】:
-
您是否尝试过使用滑块包?有一个 step 参数实现了这种行为
标签: r rolling-computation rollapply runner