You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按客户分组计算连续问题状态的持续时长(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:

customerdateissueduration
AB2000-09-1100
AB2000-09-1211
AB2000-09-1311
AB2000-09-1411
AB2000-09-1511

期望结果

希望得到每个连续问题状态的累计时长,格式如下:

customerdateissueduration
AB2000-09-1100
AB2000-09-1211
AB2000-09-1312
AB2000-09-1413
AB2000-09-1514
BC2000-09-1300
BC2000-09-1400
BC2000-09-1511
CD2001-05-2311
CD2001-05-2400
CD2001-05-2511
CD2001-05-2612
解决方案

核心思路是先按客户分组,识别出每组内连续相同的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:44:59