首页 > 解决方案 > 每 4 小时按客户分组的发生次数

问题描述

我有一个数据集如下:

id  email   Date of purchase    time of purchase
1   abc@gmail.com   11/10/18    12:10 PM
2   abc@gmail.com   11/10/18    02:11 PM
3   abc@gmail.com   11/10/18    03:14 PM
4   abc@gmail.com   11/11/18    06:16 AM
5   abc@gmail.com   11/11/18    09:10 AM
6   def@gmail.com   11/10/18    12:17 PM
7   def@gmail.com   11/10/18    03:24 PM
8   def@gmail.com   11/10/18    08:16 PM
9   def@gmail.com   11/10/18    09:13 PM
10  def@gmail.com   11/11/18    12:01 AM

我想计算每个电子邮件 ID 在 4 小时内进行的交易次数。例如,电子邮件 ID:abc@gmail.com 从 11/10/18 12.10 PM 到 11/10/18 4.10 PM 进行了 3 次交易,并从 11/11/18 6.16 AM 到 11/11/18 进行了 2 次交易上午 10 点 16 分。电子邮件 ID:def@gmail.com 从 11/10/18 12.17 PM 到 11/10/18 4.17 PM 进行了 2 次交易,并从 11/10/18 8.16 PM 到 11/11/18 12.16 AM 进行了 3 次交易。

我想要的输出是:

 email          hour interval                           purchase in 4 hours
abc@gmail.com   [11/10/18 12.10 PM to 11/10/18 4.10 PM] 3
abc@gmail.com   [11/11/18 6.16 AM to 11/11/18 10.16 AM] 2
def@gmail.com   [11/10/18 12.17 PM to 11/10/18 4.17 PM] 2
def@gmail.com   [11/10/18 8.16 PM to 11/11/18 12.16 AM] 3

我每小时都这样做。但我不知道如何在 4 小时、6 小时、12 小时等特定时间间隔内执行此操作。我的数据集有 500k 行。任何帮助将不胜感激。TIA。:)

标签: r

解决方案


cut一个选项是在转换为DateTime类之后创建 4 小时间隔的垃圾箱

library(dplyr)
library(stringr)
library(lubridate)
df1 %>% 
   group_by(email, grp = cut(mdy_hms(str_c(purchase, time_of_purchase)),
                breaks = '4 hour')) %>% 
   summarise(n = n())

如果我们需要从每封“电子邮件”的第一个小时开始划分

df1 %>% 
    mutate(datetime = mdy_hms(str_c(purchase, time_of_purchase))) %>%
    group_by(email) %>%
    group_by(grp = cut(datetime, breaks = seq(from =  min(datetime),
                       to = max(datetime),
                       by = "4 hour")),
           add = TRUE) %>%
    summarise(n = n())

推荐阅读