r - 每 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。:)
解决方案
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())
推荐阅读
- networking - 互连 4 个 Dell S4128F-ON 交换机,LACP/LAG 配置
- scheduled-tasks - 有没有办法在 MassTransit 的特定时间触发批量消费?
- reactjs - 如果我多放一个大写字母,反应路由器 V3 路由不匹配
- python - 如何过滤列表中的嵌套字典
- angular - Angular 键盘快捷键的更多组合?
- libgdx - libgdx 可以用来创建非游戏应用程序吗?
- moq - 为真实对象创建代理
- angular - Angular 11如何从firestore映射数据
- python - 如何将 Pandas DataFrame 转换为 Discord Embed?
- jenkins - 如何添加 Jacoco 整体覆盖率