如何将R中52周的运动session数据拆分归类为12个月的汇总数据?
R语言周维度课程数据按月拆分汇总方案
推荐实现方案(对应思路1,高效无冗余)
核心逻辑是直接为每节课程分配虚拟日期,无需生成冗余的天级数据,天然支持跨月周的拆分统计。
需先加载依赖包:
library(dplyr) library(lubridate)
完整处理代码:
# 1. 为每节课程匹配虚拟日期 processed_df <- qdf %>% # 同周同课程类型下的2节课程排序 group_by(type, week) %>% mutate(session_idx = dense_rank(session)) %>% ungroup() %>% mutate( # 按要求第1周起始日期为2020-01-01 week_start = ymd("2020-01-01") + weeks(week - 1), # 每周2节课程间隔2天分配日期,可根据实际开课间隔调整天数 course_date = week_start + days(2 * (session_idx - 1)), # 提取归属月份,需要数字月份可删除label参数 month = month(course_date, label = TRUE, abbr = FALSE) ) # 2. 按月维度汇总,可根据需求调整汇总指标 monthly_summary <- processed_df %>% group_by(month, id, type) %>% summarise( # 示例统计指标:每人每月每类课程上课次数 attend_count = n(), # 可新增其他汇总逻辑 .groups = "drop" )
思路2实现(天级扩展)
如果后续有天维度的统计需求,可以用该方案,提前生成周全量天级映射表:
# 生成1-52周天级日期映射 week_day_map <- tibble(week = 1:52) %>% mutate(week_start = ymd("2020-01-01") + weeks(week - 1)) %>% rowwise() %>% mutate(date = list(seq.Date(week_start, week_start + days(6), by = "1 day"))) %>% unnest(date) %>% mutate(month = month(date, label = TRUE, abbr = FALSE)) # 关联原数据后汇总,需按课程去重避免重复计数 monthly_summary2 <- qdf %>% left_join(week_day_map, by = "week") %>% distinct(id, type, session, month) %>% group_by(month, id, type) %>% summarise(attend_count = n(), .groups = "drop")
方案对比
- 思路1:性能更好,无冗余数据,单场课程的日期归属更精确,适合仅需按月汇总的场景
- 思路2:数据冗余度高,适合后续需要按日/周做更多维度统计的场景
内容的提问来源于stack exchange,提问作者Mark Davies
相关产品推荐
相关产品推荐

