我有一个包含几个感兴趣的变量的数据集。我想做的是使用包rollapplyr()
中的函数zoo
为每个变量计算滚动平均值作为附加列,但需要注意的是,我想width =
根据列使用不同的窗口宽度()。我还希望避免将我的数据转换为长格式。
library(tidyverse)
library(zoo)
rolling_f <- function(x, wdw, fun){ rollapplyr(x, wdw, fun, partial = TRUE) }
set.seed(1)
ex <- data.frame(
var1 = rnorm(20, 8000, 500),
var2 = rnorm(20, 8000, 500),
var3 = rnorm(20, 8000, 500),
var4 = rnorm(20, 8000, 500),
var5 = rnorm(20, 8000, 500),
var6 = rnorm(20, 8000, 500),
var7 = rnorm(20, 8000, 500),
var8 = rnorm(20, 8000, 500)
) %>%
mutate(
across(
.cols = starts_with("var"),
.fns = ~rolling_f(.x, 5, mean),
.names = "{.col}_roll"
)
)
到目前为止,我的代码为每一列计算相同的窗口宽度 (5),但我希望有人可以帮助我进一步定义自定义函数,以便窗口可以为 3 var1:var3
、 5var4:var5
和 6 ,例如。我认为这只需要在我启动的var6:var8
自定义函数中添加一些额外的代码。rolling_f()
您可以使用
case_match()
/case_when()
针对 across 中的当前列名来确定窗口大小:您还可以将
data.table::set()
和命名向量一起使用: