R语言中如何从2023年第7周往前筛选20周数据?
解决方案
首先修正你原代码里的两处小问题:
year(data$b_date)应该改为year(my_data$b_date),否则会引用不存在的data对象group_by(Name)要改成group_by(name),因为你的数据列名是小写的name
针对跨年度的周范围筛选,推荐两种可靠的实现方式:
方法一:基于日期区间直接筛选(最直观)
通过计算目标周的日期范围,直接筛选b_date落在该区间内的数据,完全避免周跨年度的计算麻烦:
library(lubridate) library(tidyverse) # 第一步:将字符型日期转换为标准日期格式 my_data$b_date <- mdy(my_data$b_date) # 定义目标周:2023年第7周 target_year <- 2023 target_week <- 7 # 计算2023年第7周的最后一天(ISO周以周日为结束日) target_week_end <- make_date(target_year) + weeks(target_week - 1) + days(6) # 往前回溯20周的起始日期(减19周是为了包含完整的20周范围) start_date <- target_week_end - weeks(19) # 筛选数据并补全周数 filtered_data <- my_data %>% # 筛选日期在目标区间内的数据 filter(b_date >= start_date & b_date <= target_week_end) %>% # 提取ISO年和周(比日历年/周更准确) mutate(iso_year = isoyear(b_date), week = isoweek(b_date)) %>% group_by(name) %>% # 补全该分组内所有缺失的周,填充Total为0 complete(week = seq(min(week), max(week), by = 1), fill = list(Total = 0))
方法二:基于ISO年度周数筛选(适合明确周范围的场景)
将每个日期的ISO年和周合并为一个数值(比如2022年第40周记为202240),通过数值范围判断来筛选跨年度的周:
library(lubridate) library(tidyverse) my_data$b_date <- mdy(my_data$b_date) target_year <- 2023 target_week <- 7 # 计算目标周的年度周数值 target_week_num <- target_year * 100 + target_week # 回溯20周的起始年度周数值 start_week_num <- target_week_num - 20 filtered_data <- my_data %>% mutate( iso_year = isoyear(b_date), iso_week = isoweek(b_date), # 合并年和周为数值,方便范围判断 week_num = iso_year * 100 + iso_week ) %>% # 筛选周数在目标范围内的数据 filter(week_num >= start_week_num & week_num <= target_week_num) %>% group_by(name) %>% # 补全分组内缺失的周 complete(week = seq(min(iso_week), max(iso_week), by = 1), fill = list(Total = 0)) %>% # 可选:移除辅助列 select(-week_num)
两种方法都能准确覆盖2023年第7周往前20周的范围(包含2022年的部分周),你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者akang
相关产品推荐
相关产品推荐

