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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:57:35