You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:37:42