R语言计算超阈值连续事件长度 统计销量连续达标天数
R语言实现销售人员连续超阈值销量事件长度计算
核心实现逻辑
现有代码仅完成了单日销量超70的标记统计,要实现连续事件长度计算,核心是按人员分组识别时间序列上的连续达标区间:
- 对每个销售人员的日度销量序列,通过累计求和逻辑给连续达标/未达标段分配独立分组ID
- 统计每个达标分组的总天数,即为该次连续超阈值事件的长度
- 销量低于70的记录统一标记为0,最终转回宽表即可实现不同人员的横向对比
可运行完整代码
注意:原代码中使用的funs()已在新版dplyr中废弃,替换为官方推荐写法,同时引入tidyr做长宽表转换处理:
set.seed(1234) # 加载依赖包 library(dplyr) library(lubridate) library(tidyr) # 构造示例数据集 Date <- seq(as.Date("2010-01-01"), as.Date("2020-01-31"), by="days") Tim_Sales <- sample(1 : 100, 3683, replace=TRUE) John_Sales <- sample(1 : 100, 3683, replace=TRUE) Rupert_Sales <- sample(1 : 100, 3683, replace=TRUE) df <- data.frame(Date, Tim_Sales, John_Sales, Rupert_Sales) # 计算连续超阈值事件长度 df_with_streak <- df %>% # 宽表转长表,按销售人员维度分组处理 pivot_longer(cols = ends_with("_Sales"), names_to = "sales_name", values_to = "daily_sales") %>% # 按人员、日期排序,保证时间序列顺序正确 arrange(sales_name, Date) %>% group_by(sales_name) %>% # 生成连续区间分组ID:每遇到一次销量<=70的记录,分组ID累加1 mutate(event_id = cumsum(daily_sales <= 70)) %>% group_by(sales_name, event_id) %>% # 计算当前事件长度:达标组取组内总天数,未达标组标记为0 mutate(consecutive_days = ifelse(first(daily_sales) > 70, n(), 0)) %>% ungroup() %>% # 转回宽表结构,方便不同人员横向对比 select(Date, sales_name, consecutive_days) %>% pivot_wider(names_from = sales_name, values_from = consecutive_days, names_glue = "{sales_name}_streak") %>% # 拼接原始销量数据,方便结果核对 left_join(df, by = "Date") # 查看前20行结果验证 head(df_with_streak, 20)
结果说明
- 输出结果中
Tim_Sales、John_Sales、Rupert_Sales三列为原始日销量数据 - 新增的
Tim_Sales_streak、John_Sales_streak、Rupert_Sales_streak三列为对应人员的连续超阈值事件长度:比如某段连续5天销量超70,这5行对应的列值均为5;销量低于70的行该列值记为0,后续再达标时重新从1开始计数 - 如果需要保留原有单日超阈值计数功能,直接在结果表中新增列计算即可:
mutate(daily_over_count = (Tim_Sales>70)+(John_Sales>70)+(Rupert_Sales>70))
内容的提问来源于stack exchange,提问作者cando
相关产品推荐
相关产品推荐

