我有三个商店的多种产品的每日销售数据。它看起来像这样:
item_id | 商店_id | 类别_id | 部门 ID | 日期 | 事件名称 | 每日价格 |
---|---|---|---|---|---|---|
a | tx_1 | 食物 | 1 | 2012/12/24 | 6 | |
a | tx_1 | 食物 | 1 | 2012/12/25 | 圣诞节 | 6 |
a | tx_1 | 食物 | 1 | 2012/12/26 | 6 | |
a | tx_1 | 食物 | 1 | 2012/12/27 | 7 | |
a | tx_1 | 食物 | 1 | 2012/12/28 | 7 | |
b | tx_1 | 食物 | 1 | 2012/12/24 | 6 | |
b | tx_1 | 食物 | 1 | 2012/12/25 | 圣诞节 | 6 |
b | tx_1 | 食物 | 1 | 2012/12/26 | 6 | |
b | tx_1 | 食物 | 1 | 2012/12/27 | 7 | |
b | tx_1 | 食物 | 1 | 2012/12/28 | 7 |
我想使用 R 中 lubridate 包中的 Floor_date 将每周四舍五入到星期一日期,然后使用 group_by 并汇总来计算每周平均价格。但是,我希望每周保留 event_name(如果特定一周内有的话)。在 group_by 中包含 event_name 没有帮助,因为一周中的某一天可能有事件,但其他日期可能没有,并且它们会单独分组。假设每周从星期一开始,2012/12/24 是星期一,我该如何实现这一点
item_id | 商店_id | 类别_id | 部门 ID | 日期 | 事件名称 | 每周平均价格 |
---|---|---|---|---|---|---|
a | tx_1 | 食物 | 1 | 2012/12/24 | 圣诞节 | 6.4 |
b | tx_1 | 食物 | 1 | 2012/12/24 | 圣诞节 | 6.4 |
您可以通过过滤掉空事件,然后按 event_name 汇总每周价格并采用其他列中的第一列来实现此玩具示例所需的输出:
library(tidyverse)
filter(df, !is.na(event_name)) |>
mutate(week_start=floor_date(date, unit = "week", week_start = 1)) |>
summarise(store_id=first(store_id),
category_id=first(category_id),
event_name=first(event_name),
dept_id=first(dept_id),
weekly_avg_price=mean(daiy_price, na.rm=TRUE), .by=c(item_id, week_start))
给予:
# A tibble: 2 × 7
item_id week_start store_id category_id event_name dept_id weekly_avg_price
<chr> <date> <chr> <chr> <chr> <dbl> <dbl>
1 a 2012-12-24 tx_1 food christmas 1 6
2 b 2012-12-24 tx_1 food christmas 1 6