Я не думаю, что вы сможете сделать лучше, чем написать цикл for
для этого. Существуют пакеты, которые предлагают экспоненциальную скользящую среднюю, которая похожа, но не совсем одинакова.
decay_sum <- function(tm, vl, decay) {
last_time <- 0
current_sum <- 0
sums <- numeric(length(vl))
ldecay <- log(1-decay)
for (i in 1:length(vl)) {
delta <- as.numeric(tm[i] - last_time)
current_sum <- current_sum * exp(ldecay * delta/365) + vl[i]
last_time <- tm[i]
sums[i] <- current_sum
}
sums
}
В качестве теста:
> df2 <- data.frame(when=Sys.time() + 365 * 24 * 60 * 60 * 1:50,value=1)
> df2 %>% mutate(dis=decay_sum(when, value, .1))
when value dis
1 2019-08-29 10:35:32 1 1.000000
2 2020-08-28 10:35:32 1 1.900000
3 2021-08-28 10:35:32 1 2.710000
4 2022-08-28 10:35:32 1 3.439000
Предполагается, что столбец даты упорядочен (так что вы можете добавить arrange
при необходимости).