按客户分组计算连续问题状态的持续时长(R语言)
问题
我有一组客户每日活动日志,记录了客户账户是否存在问题(1表示有问题,0表示无问题)。客户账户可能多次出现问题,且问题可能持续多天,需要按客户分组计算每个连续问题状态的每日累计时长。
示例数据
df <- data.frame(customer= c('AB','AB','AB','AB','AB', 'BC','BC','BC', 'CD','CD','CD','CD'), date=as.Date(c("11/09/2000","12/09/2000","13/09/2000", "14/09/2000","15/09/2000", "13/09/2000","14/09/2000","15/09/2000", "23/05/2001","24/05/2001","25/05/2001", "26/05/2001"), "%d/%m/%Y"), issue=c(0,1,1,1,1,0,0,1,1,0,1,1))
错误结果
尝试索引计数器方法后,无法正确统计连续天数,例如客户AB的问题每日时长均显示为1,而非递增的1、2、3、4:
| customer | date | issue | duration |
|---|---|---|---|
| AB | 2000-09-11 | 0 | 0 |
| AB | 2000-09-12 | 1 | 1 |
| AB | 2000-09-13 | 1 | 1 |
| AB | 2000-09-14 | 1 | 1 |
| AB | 2000-09-15 | 1 | 1 |
期望结果
希望得到每个连续问题状态的累计时长,格式如下:
| customer | date | issue | duration |
|---|---|---|---|
| AB | 2000-09-11 | 0 | 0 |
| AB | 2000-09-12 | 1 | 1 |
| AB | 2000-09-13 | 1 | 2 |
| AB | 2000-09-14 | 1 | 3 |
| AB | 2000-09-15 | 1 | 4 |
| BC | 2000-09-13 | 0 | 0 |
| BC | 2000-09-14 | 0 | 0 |
| BC | 2000-09-15 | 1 | 1 |
| CD | 2001-05-23 | 1 | 1 |
| CD | 2001-05-24 | 0 | 0 |
| CD | 2001-05-25 | 1 | 1 |
| CD | 2001-05-26 | 1 | 2 |
解决方案
核心思路是先按客户分组,识别出每组内连续相同的issue状态段,再针对每个状态段计算累计时长(issue为0时时长固定为0,issue为1时按日期顺序递增计数)。
方法一:使用dplyr包
library(dplyr) df_result <- df %>% arrange(customer, date) %>% group_by(customer) %>% # 生成连续相同issue的分组编号 mutate(issue_group = cumsum(issue != lag(issue, default = -1))) %>% group_by(customer, issue_group) %>% # 计算累计时长 mutate(duration = ifelse(issue == 0, 0, row_number())) %>% ungroup() %>% select(-issue_group) print(df_result)
方法二:使用Base R
# 先按客户和日期排序数据 df_sorted <- df[order(df$customer, df$date), ] # 生成每个客户的连续issue状态组 df_sorted$issue_group <- with(df_sorted, { ave(issue, customer, FUN = function(x) { cumsum(c(TRUE, x[-1] != x[-length(x)])) }) }) # 计算累计时长 df_sorted$duration <- with(df_sorted, { ave(issue, customer, issue_group, FUN = function(x) { if(x[1] == 0) rep(0, length(x)) else seq_along(x) }) }) # 移除临时分组列并输出结果 df_result <- df_sorted[, names(df_sorted) != "issue_group"] print(df_result)
内容的提问来源于stack exchange,提问作者ddbd1417
相关产品推荐
相关产品推荐

