dplyr: agrupando e resumindo / modificando dados com janelas de tempo de rolagem

Tenho dados de séries temporais irregulares que representam um determinado tipo de transação para os usuários. Cada linha de dados tem registro de data e hora e representa uma transação naquele momento. Pela natureza irregular dos dados, alguns usuários podem ter 100 linhas em um dia e outros usuários podem ter 0 ou 1 transação por dia.

Os dados podem ser algo como isto:

data.frame(
  id = c(1, 1, 1, 1, 1, 2, 2, 3, 4),
  date = c("2015-01-01", 
           "2015-01-01", 
           "2015-01-05", 
           "2015-01-25",
           "2015-02-15",
           "2015-05-05", 
           "2015-01-01", 
           "2015-08-01", 
           "2015-01-01"),
  n_widgets = c(1,2,3,4,4,5,2,4,5)
)

   id       date n_widgets
1  1 2015-01-01         1
2  1 2015-01-01         2
3  1 2015-01-05         3
4  1 2015-01-25         4
5  1 2015-02-15         4
6  2 2015-05-05         5
7  2 2015-01-01         2
8  3 2015-08-01         4
9  4 2015-01-01         5

Muitas vezes, gostaria de saber algumas estatísticas contínuas sobre os usuários. Por exemplo: para esse usuário em um determinado dia, quantas transações ocorreram nos 30 dias anteriores, quantos widgets foram vendidos nos 30 dias anteriores etc.

Correspondendo ao exemplo acima, os dados devem ter a seguinte aparência:

   id     date    n_widgets  n_trans_30  total_widgets_30
1  1 2015-01-01         1           1             1
2  1 2015-01-01         2           2             3
3  1 2015-01-05         3           3             6
4  1 2015-01-25         4           4             10
5  1 2015-02-15         4           2             8
6  2 2015-05-05         5           1             5
7  2 2015-01-01         2           1             2
8  3 2015-08-01         4           1             4
9  4 2015-01-01         5           1             5

Se a janela de tempo for diária, a solução é simples:data %>% group_by(id, date) %>% summarize(...)

Da mesma forma, se a janela de tempo for mensal, isso também é relativamente simples com o lubridato:data %>% group_by(id, year(date), month(date)) %>% summarize(...)

No entanto, o desafio que estou enfrentando é como configurar uma janela de tempo por um período arbitrário: 5 dias, 10 dias etc.

Há também oRcppRoll biblioteca, mas ambosRcppRoll e as funções de rolamento emzoo parece mais configurado para séries temporais regulares. Até onde eu sei, essas funções da janela funcionam com base no número de linhas em vez de um período especificado - a principal diferença é que um determinado período pode ter um número diferente de linhas, dependendo da data e do usuário.

Por exemplo, é possível para o usuário 1 que o número de transações nos 5 dias anteriores a2015-01-01 é igual a 100 transações e, para o mesmo usuário, o número de transações nos 5 dias anteriores a2015-02-01 é igual a 5 transações. Assim, olhar para trás um número definido de linhas simplesmente não funcionará.

Além disso, há outro encadeamento SO discutindo datas de rolagem para dados do tipo de séries temporais irregulares (Crie uma nova coluna com base na condição existente em uma data de lançamento) no entanto, a solução aceita estava usandodata.table e eu estou procurando especificamente por umdplyr maneira de conseguir isso.

Suponho que, no cerne desta questão, esse problema possa ser resolvido respondendo a essa pergunta: como possogroup_by períodos arbitrários emdplyr. Como alternativa, se houver um diferentedplyr maneira de alcançar acima sem uma complicadagroup_by, como eu posso fazer isso?

EDIT: exemplo atualizado para tornar a natureza da janela rolante mais clara.

questionAnswers(4)

yourAnswerToTheQuestion