You need to enable JavaScript to run this app. R实现:基于开放关闭周数按活跃年龄生成分组活跃时间序列
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 09:45:02