在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)):过滤掉组内的空事件名称后取第一个有效值,保证只要周内存在事件就会被留存;若周内无事件则返回NAmean(daily_price)直接计算组内每日价格的平均值,对应示例中(6+6+6+7+7)/5=6.4的结果
最终输出结果
| item_id | store_id | category_id | dept_id | date | event_name | weekly_avg_price |
|---|---|---|---|---|---|---|
| a | tx_1 | food | 1 | 2012-12-24 | christmas | 6.4 |
| b | tx_1 | food | 1 | 2012-12-24 | christmas | 6.4 |
内容的提问来源于stack exchange,提问作者Tim George
相关产品推荐
相关产品推荐

