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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:24:26