如何基于120天时间区间将客户订单DataFrame转换为宽格式
解决R中客户订单120天区间的宽格式转换问题
首先对原始数据做预处理,转换日期格式并按客户、订单时间排序:
library(dplyr) library(tidyr) # 转换日期类型并按客户+订单日期排序 df <- df %>% mutate(orderdate = as.Date(orderdate)) %>% arrange(customerid, orderdate)
接下来按客户分组,精准划分120天订单区间:
核心逻辑:以每个客户的首单日期为首个区间起始,后续订单若与当前区间起始日期差超过120天,则开启新区间,新区间起始为当前订单日期。
df <- df %>% group_by(customerid) %>% mutate( # 计算当前订单与客户首单的天数差 day_diff = orderdate - first(orderdate), # 判断是否需要新建区间:非首单且与首单差超120天则标记 new_group = ifelse(day_diff > 120 & row_number() != 1, 1, 0), # 累积标记生成区间分组ID group_id = cumsum(new_group) + 1 ) %>% ungroup()
最后将每个客户的每个区间转换为宽格式:
result <- df %>% group_by(customerid, group_id) %>% # 为每个区间内的订单生成序号列名 mutate(order_num = paste0("order_", row_number())) %>% pivot_wider( id_cols = c(customerid, group_id), names_from = order_num, values_from = orderid ) %>% ungroup() # 可选:移除group_id列(若不需要保留区间标识) result <- result %>% select(-group_id)
运行后输出结果如下:
| customerid | order_1 | order_2 | order_3 |
|---|---|---|---|
| A1 | 1 | 2 | 3 |
| A1 | 4 | 5 | NA |
| A2 | 6 | 7 | 8 |
该方案能准确区分跨120天的订单区间:比如A1的订单4(2020-12-21)与首单(2020-05-19)间隔超120天,单独划分为新区间;A2的三个订单均在首单120天范围内,合并为一行。
内容的提问来源于stack exchange,提问作者pandas123
相关产品推荐
相关产品推荐

