R语言按零售商、门店分组计算最近4周金额与去年同期百分比变化
完整实现代码
library(tidyverse) A_processed <- A %>% # 拆分final_week提取年份和独立周标识(后四位为和年份无关的周次标记) mutate( year = as.integer(substr(final_week, 1, 4)), week_id = substr(final_week, 5, 8) ) %>% # 按零售商、门店分组 group_by(retailer, store) %>% # 分组内按final_week降序排序 arrange(desc(final_week), .by_group = TRUE) %>% # 标记当前分组下最近4周为需要计算同比的目标周 mutate(is_target_week = row_number() <= 4) %>% ungroup() %>% # 按门店+周标识分组,匹配同周次的两年数据 group_by(retailer, store, week_id) %>% # 过滤掉不需要计算的非目标周 filter(any(is_target_week)) %>% # 计算同比百分比差异 summarise( current_year = max(year), current_dollars = dollars[year == max(year)], last_year_dollars = dollars[year == min(year)], # 百分比差异:(今年值-去年值)/去年值*100%,正为增长负为下降 YoY_diff_pct = (current_dollars - last_year_dollars)/last_year_dollars * 100, .groups = "drop" ) # 若需要把计算结果合并回原表,可通过retailer、store、week_id三个字段做left_join关联
逻辑说明
- 首先处理
final_week字段拆分出年份和周标识,解决同期周匹配的问题 - 修正了你初始代码中
arrange嵌套的错误,用.by_group = TRUE参数实现分组内排序 - 标记每个门店的最近4周为目标周后,按周标识分组即可直接匹配到两年同期的销售数据,按需计算差值即可
- 若存在去年同期数据缺失的情况,计算结果会自动返回NA,不需要额外做异常处理
内容的提问来源于stack exchange,提问作者Jane Miller
相关产品推荐
相关产品推荐

