如何在R中按分组动态调用增长率计算DataFrame预期销售额?
解决分组动态计算未来销售额的问题
示例数据构造
先模拟你的数据结构(方便测试验证):
library(tidyverse) df <- tibble( product = rep(c("A", "B"), each = 11), region = rep(c("North", "South"), each = 11), year = rep(2023:2033, 2), growth = rep(c(0.05, 0.08), each = 11), # 每个产品-地区组合对应固定增长率 sales = ifelse(year == 2023, c(1000, 1500), NA) # 仅2023年有已知销售额 )
核心解决代码
利用dplyr分组 + purrr::accumulate动态读取分组内的增长率:
df <- df %>% group_by(product, region) %>% arrange(year) %>% # 务必确保年份按升序排列,避免计算逻辑混乱 mutate( sales_expected = accumulate( .init = first(sales), # 以2023年的已知销售额为初始值 .x = 2:n(), # 从第2行(2024年)开始计算后续年份 .f = function(prev, idx) prev * (1 + first(growth)) # 动态获取当前分组的固定增长率 ) %>% unlist() ) %>% ungroup()
简化写法(逻辑更直观)
如果觉得accumulate的参数设置有点绕,也可以用lag逻辑实现:
df <- df %>% group_by(product, region) %>% arrange(year) %>% mutate( sales_expected = sales, sales_expected = accumulate(sales_expected, ~ if(is.na(.y)) .x * (1 + first(growth)) else .y) ) %>% ungroup()
关键说明
- 分组独立计算:通过
group_by(product, region)确保每个产品-地区组合单独运算,新增组合时无需修改代码 - 动态取增长率:用
first(growth)获取当前分组的固定增长率(每个分组内的growth值一致),替代你之前写死的固定值0.1 - 年份排序:必须先按
year升序排列,否则累积计算的顺序会出错
内容的提问来源于stack exchange,提问作者piotr.kaczmarski
相关产品推荐
相关产品推荐

