2016-06-24 59 views
2

比方說,我有一個時間戳數據框和當時銷售的相應門票數量。使用滾動時間間隔來計算R和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 

我想知道如何計算在所有門票的特定時間範圍內出售的門票數量。例如,我想計算所有票後15分鐘內售出的票數。在這種情況下,第一行將有三張票,第二行將有四張票,等等。

理想情況下,我正在尋找一個dplyr解決方案,因爲我想爲具有group_by()函數的多個商店。但是,我在確定如何保存每個給定行的Timestamp時遇到一些問題,同時通過dplyr語法搜索所有時間戳。

回答

0

這是一個使用data.table的解決方案。還包含不同的商店。

示例數據:

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))) 

現在應用以下:

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

這給你

    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

不完全。這只是第二行的正確答案。每行所需的窗口是不同的。所以對於第一行,我想知道5:30到5:45之間的票數,第二行是5:32和5:47之間的票數,5:38和5之間的第三行:53等,這是否有意義? – dmartin

2

這是醜陋的一個我以前寫的一個簡化版本..

# 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

data.tablecurrent development version,v1.9.7,non-equi連接被實現。假設您的data.frame被稱爲dfTimestampPOSIXct類型:

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] 

對於每一行t,所有行df$Timestamp < that_row被取出。 by=.EACHI指示表達式sum(ticket_count)t中的每一行運行。這給你想要的結果。

希望這會有所幫助。