dplyr: группировка и суммирование / изменение данных с использованием временных окон

У меня есть нерегулярные данные временных рядов, представляющие определенный тип транзакции для пользователей. Каждая строка данных имеет временную метку и представляет транзакцию в то время. Из-за неправильной природы данных у некоторых пользователей может быть 100 строк в день, а у других пользователей может быть 0 или 1 транзакция в день.

Данные могут выглядеть примерно так:

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

Часто я хотел бы узнать некоторую статистику о пользователях. Например: для данного пользователя в определенный день, сколько транзакций произошло за предыдущие 30 дней, сколько виджетов было продано за предыдущие 30 дней и т. Д.

В соответствии с приведенным выше примером данные должны выглядеть следующим образом:

   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

Если временное окно ежедневно, то решение простое:data %>% group_by(id, date) %>% summarize(...)

Точно так же, если временное окно ежемесячно, это также относительно просто с lubridate:data %>% group_by(id, year(date), month(date)) %>% summarize(...)

Однако проблема, с которой я сталкиваюсь, заключается в том, как настроить временное окно для произвольного периода: 5 дней, 10 дней и т. Д.

Там такжеRcppRoll библиотека, но обаRcppRoll и функции прокатки вzoo кажется больше настройки для регулярных временных рядов. Насколько я могу судить, эти оконные функции работают на основе количества строк вместо указанного периода времени - ключевое отличие состоит в том, что определенный период времени может иметь различное количество строк в зависимости от даты и пользователя.

Например, для пользователя 1 возможно, что количество транзакций за 5 дней, предшествующих2015-01-01 равно 100 транзакциям и для одного и того же пользователя количество транзакций за 5 дней, предшествующих2015-02-01 равно 5 транзакциям. Таким образом, просмотр заданного количества строк просто не будет работать.

Кроме того, есть еще одна тема SO, в которой обсуждаются даты перехода для данных типа нерегулярных временных рядов (Создать новый столбец на основе условия, существующего в дате перехода) однако принятое решение использовалоdata.table и я специально ищуdplyr способ достижения этого.

Я предполагаю, что в основе этой проблемы, эта проблема может быть решена путем ответа на этот вопрос: как я могуgroup_by произвольные периоды времени вdplyr, В качестве альтернативы, если есть другойdplyr способ достичь выше без сложногоgroup_by, как мне это сделать?

РЕДАКТИРОВАТЬ: обновленный пример, чтобы сделать природу скользящего окна более ясным.

Ответы на вопрос(4)

Ваш ответ на вопрос