如何将120天间隔内的客户订单按索引日期分组转换为宽格式
120天订单间隔分组转宽格式的R实现
需求说明
将每个客户的订单按120天间隔分组:以超出前一组索引日期120天范围的首个订单日期作为新组的索引日期,每组对应一行;再将组内多笔订单的ID、日期信息转为宽格式列。
数据准备
先将原数据的日期字段转为Date类型,确保后续日期计算准确:
customerid <- c("A1", "A1", "A1", "A1", "A1", "A2", "A2", "A2") orderid <- c("1", "2", "3", "4", "5", "6", "7", "8") orderdate <- c("2020-05-19", "2020-09-08", "2020-09-16", "2020-12-21", "2021-01-03", "2020-08-21","2020-11-22","2021-02-01") df <- data.frame(customerid, orderid, orderdate) # 转换日期格式为Date类型 df$orderdate <- as.Date(df$orderdate)
步骤1:按客户划分120天间隔组
通过循环跟踪每个组的起始日期,判断订单是否属于当前组,生成组编号:
library(dplyr) df_grouped <- df %>% arrange(customerid, orderdate) %>% group_by(customerid) %>% mutate( group_id = { groups <- numeric(n()) current_start <- first(orderdate) current_group <- 1 groups[1] <- current_group # 遍历后续订单,判断是否开启新组 for(i in 2:n()){ # 可根据需求调整判断条件:> 表示超出120天当天算新组;>= 表示包含120天当天 if(orderdate[i] > current_start + 120){ current_group <- current_group + 1 current_start <- orderdate[i] # 更新新组的起始日期 } groups[i] <- current_group } groups } ) %>% ungroup()
关键逻辑:每次开启新组后,后续订单的判断基准更新为新组的起始日期,而非第一个订单的日期。
步骤2:将分组数据转为宽格式
用tidyr::pivot_wider将组内订单的ID、日期按顺序展开为列:
library(tidyr) final_result <- df_grouped %>% group_by(customerid, group_id) %>% mutate(order_seq = row_number()) %>% # 给组内订单编序号 pivot_wider( id_cols = c(customerid, group_id), names_from = order_seq, values_from = c(orderid, orderdate), names_glue = "{.value}_{order_seq}" # 列名格式:字段名_序号 ) %>% ungroup() # 查看结果 print(final_result)
输出示例(简化版)
| customerid | group_id | orderid_1 | orderid_2 | orderdate_1 | orderdate_2 |
|---|---|---|---|---|---|
| A1 | 1 | 1 | 2 | 2020-05-19 | 2020-09-08 |
| A1 | 1 | 1 | 3 | 2020-05-19 | 2020-09-16 |
| A1 | 2 | 4 | 5 | 2020-12-21 | 2021-01-03 |
| A2 | 1 | 6 | 7 | 2020-08-21 | 2020-11-22 |
| A2 | 2 | 8 | NA | 2021-02-01 | NA |
(注:若组内只有1笔订单,后续列会显示NA,可根据需求用replace_na()填充)
内容的提问来源于stack exchange,提问作者pandas123
相关产品推荐
相关产品推荐

