如何在R中基于日期生成含缺失周且标注每周周一的周频次表
R 周频次统计补全缺失周的实现方案
你可以通过生成完整周序列后左关联统计结果的方式实现需求,代码逻辑如下:
首先加载依赖包:
library(tidyverse) library(lubridate)
处理原始数据并转换日期格式:
# 导入原始数据 raw_data <- data.frame(date = c("7/29/2021 21:18", "7/6/2021 20:37", "7/23/2021 20:11", "7/23/2021 21:35", "7/23/2021 21:42", "7/23/2021 21:47", "10/11/2021 14:45", "10/11/2021 15:57", "10/11/2021 16:23", "7/29/2021 15:52", "9/7/2021 14:36", "8/31/2021 21:05", "8/25/2021 18:22", "6/28/2021 14:52", "10/8/2021 19:34", "7/19/2021 15:38", "10/27/2021 21:09", "10/8/2021 15:56", "9/21/2021 17:20", "8/25/2021 20:42", "8/30/2021 20:28", "5/20/2021 14:58", "11/1/2021 21:09", "11/1/2021 20:15", "8/5/2021 16:17", "6/30/2021 20:12", "5/14/2021 17:36", "5/19/2021 20:40", "5/20/2021 21:06", "5/19/2021 20:59")) # 转换日期格式,匹配每条记录所属周的周一日期 raw_data <- raw_data %>% mutate(full_date = mdy_hm(date), # week_start = 1 表示将周一设为一周的起始日,需要周日起始可改为0 week_monday = floor_date(full_date, unit = "week", week_start = 1))
生成覆盖全时间范围的周序列表:
# 取时间范围的首尾周一 min_week <- min(raw_data$week_monday) max_week <- max(raw_data$week_monday) # 生成所有周的基准表,附带周编号和格式化日期 full_weeks <- tibble(week_monday = seq.Date(min_week, max_week, by = "7 days")) %>% mutate(Num = week(week_monday), Date = format(week_monday, "%m/%d/%Y"))
关联统计结果,缺失周计数补0:
result <- full_weeks %>% left_join(raw_data %>% count(week_monday, name = "Count"), by = "week_monday") %>% replace_na(list(Count = 0)) %>% select(Num, Date, Count)
输出的result就是符合要求的频次表,该方案优势如下:
- 以周起始日期为匹配基准,避免周数计算规则不一致导致的匹配误差
- 自动覆盖时间范围内的所有周,无需手动补全周编号
- 兼容跨年时间序列,不会出现不同年份同周号匹配错误的问题
- 周起始规则可灵活调整,适配不同统计标准
内容的提问来源于stack exchange,提问作者RL_Pug
相关产品推荐
相关产品推荐

