I think combining dplyr with slider is the bests approach for this job.
library(tidyverse)
(my_data <- data.frame(
id = c(1, 1, 1, 1, 2, 2, 2, 3, 4, 4, 5, 5, 5, 5, 5),
index = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 1L, 1L, 2L, 1L, 2L, 3L, 4L, 5L),
var_1 = c(0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1),
var_2 = c(1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0)
))
library(slider)
#do for 1
my_data %>% group_by(id) %>%
mutate(avg_var_1 = slide_index(.x = var_1,
.i = index,
.f = mean,
.before = 2)%>%unlist())
#do for both
my_data %>% group_by(id) %>%
mutate(across(.cols = c(var_1,var_2),
.fns = ~ unlist(slide_index(.x = .x,
.i = index,
.f = mean,
.before = 2)),
.names = "avg_{.col}"))