首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用滚动时间间隔计算R和dplyr中的行数

使用滚动时间间隔计算R和dplyr中的行数
EN

Stack Overflow用户
提问于 2016-06-25 00:11:13
回答 3查看 1.5K关注 0票数 2

假设我有一个时间戳数据帧,其中包含当时售出的相应数量的门票。

代码语言:javascript
复制
         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()函数对多个商店执行此操作。但是,我在弄清楚如何在通过dplyr语法搜索所有时间戳的同时,为给定行保留固定的每个时间戳时遇到了一些麻烦。

EN

回答 3

Stack Overflow用户

发布于 2016-06-25 02:23:39

这是我之前写的丑陋版本的一个简单版本..

代码语言:javascript
复制
# 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
EN

Stack Overflow用户

发布于 2016-06-26 06:11:15

data.tablecurrent development version中,v1.9.7实现了non-equi连接。假设您的data.frame名为df,并且Timestamp列是POSIXct类型:

代码语言:javascript
复制
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中的每一行运行。这会给出你想要的结果。

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2016-06-25 00:33:54

这是一个使用data.table的解决方案。还合并了不同的商店。

示例数据:

代码语言:javascript
复制
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)))

现在应用以下内容:

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

这将为您提供

代码语言:javascript
复制
                    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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38017753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档