使用R lubridate获取去年同期供应商市场份额以计算同比变化
计算供应商市场份额同比变化的实现方案
你已经完成了总销售额和市场份额的计算,并且将年份转为Date类型。要新增PY_Market_Share列(同一Product、Region、Vendor组合的去年同期市场份额),可以借助lubridate的日期处理能力结合dplyr的分组/连接操作实现,具体步骤如下:
1. 加载依赖包
确保已加载所需工具包:
library(lubridate) library(dplyr)
2. 新增去年同期市场份额列
这里提供两种可靠的实现方式,你可以根据数据完整性选择:
方式一:使用lag()(适用于每组每年都有完整记录的场景)
通过提取年份并按组排序,直接取上一年的市场份额:
test3 <- test3 %>% # 从Date类型的Year列提取年份数值 mutate(Current_Year = year(Year)) %>% # 按产品、区域、供应商分组 group_by(Product, Region, Vendor) %>% # 按年份排序后,取前一行(去年)的Market_Share作为PY_Market_Share mutate(PY_Market_Share = lag(Market_Share, order_by = Current_Year)) %>% ungroup()
方式二:使用left_join(适用于存在年份缺失的场景,更严谨)
先构建包含去年市场份额的辅助数据集,再通过连接匹配到原数据:
test3 <- test3 %>% mutate(Current_Year = year(Year)) %>% # 连接去年的市场份额数据 left_join( # 构建辅助表:将年份+1,作为匹配今年的键 test3 %>% mutate(PY_Year = year(Year) + 1) %>% select(Product, Region, Vendor, PY_Year, PY_Market_Share = Market_Share), by = c("Product", "Region", "Vendor", "Current_Year" = "PY_Year") ) %>% ungroup()
3. 计算市场份额同比变化(可选)
拿到PY_Market_Share后,直接计算同比变化率:
test3 <- test3 %>% mutate(YoY_Change = (Market_Share - PY_Market_Share) / PY_Market_Share)
说明
- 使用
lubridate::year()可以快速从Date类型的Year列中提取年份数值,避免手动处理日期格式的繁琐,确保年份提取的准确性。 - 方式二的连接法更适合数据中存在部分年份缺失的情况,不会因为缺失行导致
lag()取到错误的前序值。
内容的提问来源于stack exchange,提问作者EPBaron
相关产品推荐
相关产品推荐

