dplyr: Gruppieren und Zusammenfassen / Mutieren von Daten mit rollierenden Zeitfenstern

Ich habe unregelmäßige Zeitreihendaten, die eine bestimmte Art von Transaktion für Benutzer darstellen. Jede Datenzeile ist mit einem Zeitstempel versehen und repräsentiert zu diesem Zeitpunkt eine Transaktion. Aufgrund der unregelmäßigen Art der Daten haben einige Benutzer möglicherweise 100 Zeilen pro Tag und andere Benutzer haben möglicherweise 0 oder 1 Transaktion pro Tag.

Die Daten könnten ungefähr so aussehen:

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

Häufig würde ich gerne eine fortlaufende Statistik über Benutzer erhalten. Beispiel: für diesen Benutzer an einem bestimmten Tag, wie viele Transaktionen in den letzten 30 Tagen durchgeführt wurden, wie viele Widgets in den letzten 30 Tagen verkauft wurden usw.

Entsprechend dem obigen Beispiel sollten die Daten wie folgt aussehen:

   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

Wenn das Zeitfenster täglich ist, ist die Lösung einfach:data %>% group_by(id, date) %>% summarize(...)

Ähnlich, wenn das Zeitfenster monatlich ist, ist dies auch mit lubridate relativ einfach:data %>% group_by(id, year(date), month(date)) %>% summarize(...)

Die Herausforderung besteht jedoch darin, ein Zeitfenster für einen beliebigen Zeitraum einzurichten: 5 Tage, 10 Tage usw.

Da ist auch dasRcppRoll Bibliothek, aber beideRcppRoll und die rollenden Funktionen inzoo scheinen mehr Setup für reguläre Zeitreihen. Soweit ich weiß, arbeiten diese Fensterfunktionen basierend auf der Anzahl der Zeilen anstelle eines bestimmten Zeitraums. Der Hauptunterschied besteht darin, dass ein bestimmter Zeitraum je nach Datum und Benutzer eine unterschiedliche Anzahl von Zeilen aufweisen kann.

Zum Beispiel ist es für Benutzer 1 möglich, dass die Anzahl der Transaktionen in den 5 Tagen vor2015-01-01 entspricht 100 Transaktionen und für denselben Benutzer die Anzahl der Transaktionen in den 5 Tagen vor2015-02-01 entspricht 5 Transaktionen. Wenn Sie also auf eine bestimmte Anzahl von Zeilen zurückblicken, funktioniert dies einfach nicht.

Zusätzlich gibt es einen weiteren SO-Thread, in dem fortlaufende Daten für unregelmäßige Zeitreihentypen behandelt werden Erstelle eine neue Spalte basierend auf der Bedingung, die innerhalb eines fortlaufenden Datums existiert) Die akzeptierte Lösung verwendete jedochdata.table und ich bin speziell auf der Suche nach einemdplyr Weg dies zu erreichen.

Ich nehme an, im Kern dieses Problems kann dieses Problem durch Beantwortung dieser Frage gelöst werden: Wie kann ichgroup_by beliebige Zeiträume indplyr. Alternativ, wenn es ein anderes @ gidplyr Weg, um oben ohne ein kompliziertes @ zu erreichgroup_by, wie kann ich es tun

EDIT: aktualisiertes Beispiel, um die Art des rollenden Fensters klarer zu machen.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage