2015-10-21 7 views
3

Я пытаюсь вычислить сгруппированную текущую сумму на основе размера окна 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 вручную.

ответ

3

Используя partial=TRUE аргумент rollapplyr:

df %>% 
    group_by(ID) %>% 
    mutate(roll = rollapplyr(value, 3, sum, partial = TRUE)) %>% 
    ungroup() 

или без dplyr (все еще нужно зоопарк):

roll <- function(x) rollapplyr(x, 3, sum, partial = TRUE) 
transform(df, roll = ave(value, ID, FUN = roll)) 
Смежные вопросы