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

在R中基于lubridate实现带事件留存的销售数据周聚合

解决方案:按周聚合销售数据并留存周内事件名称

要实现按周一为周起始计算周平均价格,同时保留周内存在的事件名称,核心是不将event_name纳入分组键,而是在聚合时从组内提取非空的事件名称。以下是具体的R代码实现:

步骤1:加载所需包

library(dplyr)
library(lubridate)

步骤2:数据处理与聚合

假设你的原始数据存储在名为sales_data的数据框中,执行以下代码:

sales_processed <- sales_data %>%
  # 将字符串日期转换为Date类型
  mutate(date = mdy(date)) %>%
  # 生成以周一为起始的周日期(2012/12/24为周一,会被保留为周起始)
  mutate(week_start = floor_date(date, unit = "week", week_start = 1)) %>%
  # 按商品、门店、分类、部门、周起始日期分组
  group_by(item_id, store_id, category_id, dept_id, week_start) %>%
  summarise(
    # 计算周平均价格
    weekly_avg_price = mean(daily_price),
    # 提取周内非空的事件名称(取第一个非空值,若周内有多个事件可按需调整逻辑)
    event_name = first(na.omit(event_name)),
    .groups = "drop"
  ) %>%
  # 将周起始日期列重命名为date,匹配预期输出的列名
  rename(date = week_start)

代码关键点说明

  • floor_date(..., week_start = 1):明确指定周一为一周的起始日,确保2012/12/24被识别为周起始日期
  • 分组仅使用item_id、store_id、category_id、dept_id和周起始日期,避免因event_name的空值/非空值差异拆分同一周的数据
  • first(na.omit(event_name)):过滤掉组内的空事件名称后取第一个有效值,保证只要周内存在事件就会被留存;若周内无事件则返回NA
  • mean(daily_price)直接计算组内每日价格的平均值,对应示例中(6+6+6+7+7)/5=6.4的结果

最终输出结果

item_idstore_idcategory_iddept_iddateevent_nameweekly_avg_price
atx_1food12012-12-24christmas6.4
btx_1food12012-12-24christmas6.4

内容的提问来源于stack exchange,提问作者Tim George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:51:07