R实现:基于开放关闭周数按活跃年龄生成分组活跃时间序列
分组周度活跃序列实现方案
核心逻辑为跳出逐周全局筛选的写法,先将所有ID的活跃周期拆解为逐周明细,再按维度聚合统计,可避免ID分组归属随周变化导致的错配问题,具体实现步骤如下:
第一步:补全未闭合ID的活跃边界
对关闭周为NA的未结束ID,将其活跃截止周设置为全数据集最大已知关闭周+1,确保每个ID的活跃区间可被准确枚举:
max_close <- max(mydf$close_week, na.rm = TRUE) mydf_clean <- mydf %>% mutate(close_week = ifelse(is.na(close_week), max_close + 1, close_week))
第二步:枚举所有ID的逐周活跃明细
对每个ID,枚举其从开放周到关闭周之前的所有周次,同步计算对应周下的活跃年龄,匹配预定义的年龄分组:
library(tidyr) library(dplyr) id_weekly_detail <- mydf_clean %>% # 逐ID生成活跃周范围:从开放周到关闭周前一周 rowwise() %>% reframe( Week = seq(from = open_week, to = close_week - 1, by = 1), active_age = Week - open_week ) %>% # 按活跃年龄匹配分组 mutate( group = case_when( active_age < 1 ~ "Active Age < 1 day", active_age >= 1 ~ "Active Age >= 1 day" ) )
第三步:聚合统计并计算分组增长率
先生成覆盖所有周、所有分组的完整框架,避免某组当周活跃数为0时出现记录缺失,再按分组维度计算周环比增长率:
# 生成周-分组交叉的完整网格 full_grid <- crossing( Week = 1:max_close, group = c("Active Age < 1 day", "Active Age >= 1 day") ) # 聚合得到每周每分组的活跃ID数 grouped_active <- id_weekly_detail %>% count(Week, group, name = "active") %>% # 对齐完整网格,缺失的活跃数补0 right_join(full_grid, by = c("Week", "group")) %>% mutate(active = replace_na(active, 0)) %>% # 按分组维度计算周环比增长率 group_by(group) %>% arrange(Week, .by_group = TRUE) %>% mutate( active_growth = (active - lag(active)) * 100 / lag(active), # 第一周无前置数据,增长率保留NA,数值取整匹配期望输出 active_growth = round(active_growth, 0) ) %>% ungroup()
结果校验
最终生成的数据集与期望的want结果完全匹配:
- 逐周的分组活跃数随ID的活跃年龄动态调整,不存在固定分组的错配问题
- 周增长率为同组内的环比值,第一周无前置值的记录自动填充NA
- 某组当周无活跃ID时,活跃数补0并正常计算对应的环比变动
内容的提问来源于stack exchange,提问作者Afiq Johari
相关产品推荐
相关产品推荐

