Tenho um conjunto de dados que contém várias variáveis ​​de interesse. O que eu gostaria de fazer é calcular uma média móvel com a rollapplyr()
função do zoo
pacote para cada uma delas como colunas adicionais, mas a ressalva é que eu gostaria de usar uma largura de janela diferente ( width =
) dependendo da coluna. Também desejo evitar pivotar meus dados para o formato longo.
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"
)
)
Meu código até agora calcula a mesma largura de janela (5) para cada coluna, mas espero que alguém possa me ajudar a definir minha função personalizada melhor para que a janela possa ser 3 para var1:var3
, 5 para var4:var5
, e 6 para var6:var8
, como um exemplo. Presumo que isso simplesmente exigirá algum código adicional na rolling_f()
função personalizada que comecei.
Você pode usar
case_match()
/case_when()
em relação ao nome da coluna atual em across para determinar o tamanho da janela:Você também pode usar
data.table::set()
, com um vetor nomeado: