2016-06-24 6 views
2

Angenommen, ich habe ein Datenformat von Zeitstempeln mit der entsprechenden Anzahl der zu diesem Zeitpunkt verkauften Tickets.Verwenden eines rollenden Zeitintervalls zum Zählen von Zeilen in R und dplyr

  Timestamp   ticket_count 
      (time)    (int) 
1 2016-01-01 05:30:00   1 
2 2016-01-01 05:32:00   1 
3 2016-01-01 05:38:00   1 
4 2016-01-01 05:46:00   1 
5 2016-01-01 05:47:00   1 
6 2016-01-01 06:07:00   1 
7 2016-01-01 06:13:00   2 
8 2016-01-01 06:21:00   1 
9 2016-01-01 06:22:00   1 
10 2016-01-01 06:25:00   1 

Ich möchte wissen, wie man die Anzahl der verkauften Tickets innerhalb eines bestimmten Zeitrahmens für alle Tickets berechnet. Zum Beispiel möchte ich die Anzahl der verkauften Tickets bis zu 15 Minuten nach allen Tickets berechnen. In diesem Fall hätte die erste Zeile drei Tickets, die zweite Zeile vier Tickets usw.

Idealerweise suche ich nach einer dplyr-Lösung, da ich dies für mehrere Geschäfte mit einer group_by()-Funktion tun möchte . Allerdings habe ich ein wenig Mühe herauszufinden, wie man jeden Timestamp für eine bestimmte Zeile festhält und gleichzeitig alle Timestamps über die dplyr-Syntax durchsucht.

Antwort

0

Hier ist eine Lösung mit data.table. Auch verschiedene Läden integriert.

Beispieldaten:

library(data.table) 
dt <- data.table(Timestamp = as.POSIXct("2016-01-01 05:30:00")+seq(60,120000,by=60), 
       ticket_count = sample(1:9, 2000, T), 
       store = c(rep(c("A","B","C","D"), 500))) 

Jetzt gilt folgendes:

ts <- dt$Timestamp 
for(x in ts) { 
    end <- x+900 
    dt[Timestamp <= end & Timestamp >= x ,CS := sum(ticket_count),by=store] 
} 

Dies gibt Ihnen

    Timestamp ticket_count store CS 
     1: 2016-01-01 05:31:00   3  A 13 
     2: 2016-01-01 05:32:00   5  B 20 
     3: 2016-01-01 05:33:00   3  C 19 
     4: 2016-01-01 05:34:00   7  D 12 
     5: 2016-01-01 05:35:00   1  A 15 
     ---           
    1996: 2016-01-02 14:46:00   4  D 10 
    1997: 2016-01-02 14:47:00   9  A 9 
    1998: 2016-01-02 14:48:00   2  B 2 
    1999: 2016-01-02 14:49:00   2  C 2 
    2000: 2016-01-02 14:50:00   6  D 6 
+0

Nicht ganz. Dies wäre die richtige Antwort nur für die zweite Reihe. Das Fenster, das jede Zeile benötigt, ist unterschiedlich. Also für die erste Reihe möchte ich die Anzahl der Tickets zwischen 5:30 und 5:45 Uhr wissen, die zweite Reihe wäre die Anzahl der Tickets zwischen 5:32 und 5:47, die dritte Reihe zwischen 5:38 und 5 : 53 usw. Macht das Sinn? – dmartin

2

Dies ist eine einfachere Version der hässliche ich früher geschrieben ..

# install.packages('dplyr') 
library(dplyr) 

your_data %>% 
    mutate(timestamp = as.POSIXct(timestamp, format = '%m/%d/%Y %H:%M'), 
     ticket_count = as.numeric(ticket_count)) %>% 
    mutate(window = cut(timestamp, '15 min')) %>% 
    group_by(window) %>% 
    dplyr::summarise(tickets = sum(ticket_count)) 

       window tickets 
       (fctr) (dbl) 
1 2016-01-01 05:30:00  3 
2 2016-01-01 05:45:00  2 
3 2016-01-01 06:00:00  3 
4 2016-01-01 06:15:00  3 
4

In der current development version von data.table, v1.9.7, non-equi Joins sind implementiert.

require(data.table) # v1.9.7+ 
window = 15L # minutes 
(counts = setDT(df)[.(t=Timestamp+window*60L), on=.(Timestamp<t), 
        .(counts=sum(ticket_count)), by=.EACHI]$counts) 
# [1] 3 4 5 5 5 9 11 11 11 11 

# add that as a column to original data.table by reference 
df[, counts := counts] 

in t Für jede Reihe werden alle Zeilen, in denen df$Timestamp < that_row abgerufen wird: Angenommen, Ihre data.frame wird df und die Timestamp Spalte POSIXct Typ bezeichnet. Und by=.EACHI weist den Ausdruck sum(ticket_count) an, für jede Zeile in t auszuführen. Das gibt Ihr gewünschtes Ergebnis.

Hoffe, das hilft.