Я пытаюсь вычислить сгруппированную текущую сумму на основе размера окна k, но в случае, если индекс строки внутри строки (n) меньше k, я хочу рассчитать скользящую сумму, используя условие k = min (n, k).вычислить текущую сумму на основе индекса строки в R
Моя проблема аналогична этому вопросу R dplyr rolling sum, но я ищу решение, которое обеспечивает не-NA значение для каждой строки.
я могу получить часть пути туда с помощью dplyr и rollsum:
library(zoo)
library(dplyr)
df <- data.frame(Date=rep(seq(as.Date("2000-01-01"),
as.Date("2000-12-01"),by="month"),2),
ID=c(rep(1,12),rep(2,12)),value=1)
df <- tbl_df(df)
df <- df %>%
group_by(ID) %>%
mutate(total3mo=rollsum(x=value,k=3,align="right",fill="NA"))
df
Source: local data frame [24 x 4]
Groups: ID [2]
Date ID value tota3mo
(date) (dbl) (dbl) (dbl)
1 2000-01-01 1 1 NA
2 2000-02-01 1 1 NA
3 2000-03-01 1 1 3
4 2000-04-01 1 1 3
5 2000-05-01 1 1 3
6 2000-06-01 1 1 3
7 2000-07-01 1 1 3
8 2000-08-01 1 1 3
9 2000-09-01 1 1 3
10 2000-10-01 1 1 3
.. ... ... ... ...
В этом случае то, что я хотел бы, чтобы вернуть значение 1 для наблюдений на 2000-01-01 и значение 2 для наблюдений за 2000-02-01 гг. В более общем плане я хотел бы, чтобы скользящая сумма рассчитывалась по наибольшему возможному окну, но не превышала k.
В этом конкретном случае не так уж сложно изменить некоторые значения NA вручную. Однако в конечном итоге я хотел бы добавить еще несколько столбцов в мой фрейм данных, которые будут скользящими суммами, рассчитанными для разных окон. В этом более общем случае будет довольно утомительно возвращаться, чтобы изменить многие значения NA вручную.