抱歉,如果这是一个基本的问题,但我根本不能弄清楚这一个作为一个初学者-我试图找到类似的问题,但没有成功...
我有一个以下数据框架,其中每个产品和每个地区组合的增长率都在变化,并且在10年内保持不变(我从另一个数据框架中离开_加入它)。
我只有本年度的销售额,并希望项目10年的增长率,试图产生的结果在sales_expected
。
| 产物|区域|年|生长|销售|预期销售额|
| - -----|- -----|- -----|- -----|- -----|- -----|
|产品A|区域A| 2019年12月23日|0.1| 一百|一百|
| 产品展示|区域A| 2024年|0.1||一百一十|
| 产品展示|区域A| 2025年|0.1||一百二十一|
| 产品展示|区域A| 2026年|0.1||一百三十三|
| 产品展示|区域A| 2027年|0.1||一百四十六|
| 产品展示|区域A| 2028| 0.1||一百六十一|
| 产品展示|区域A| 2029年|0.1||一百七十七|
| 产品展示|区域A| 2030年|0.1||一百九十五|
| 产品展示|区域A|二〇三一|0.1||二一四|
| 产品展示|区域A|二〇三二|0.1||二三六|
|产品A|区域B| 2019年12月23日|0.06| 一百|一百|
| 产品展示|区域B| 2024年|零点零六||一百零六|
| 产品展示|区域B| 2025年|零点零六||一百一十二|
| ......这是什么?|......这是什么?|......这是什么?|......这是什么?|||
在我的管道中,我尝试使用从purr
包中累积:
mutate(sales_expected = accumulate(sales, fill_in))
结合fill_in
函数,该函数查找sales
列中的下一个n. a并应用增长率:
fill_in <- function(prev, new, growth) {
growth_rate <- 0.1
if_else(!is.na(new), new, prev * (1 + growth_rate))
}
这是可行的,但我不知道的是如何有条件地更改此函数中的growth_rate
参数,即它应该从列growth
中选择,而不是我手动输入,因为这显然不适用于将新产品和地区组合引入增长率变化的数据框。
非常感谢您的帮助!
1条答案
按热度按时间x9ybnkn61#
你可以用
group_by
和cumprod
来实现。cumprod(growth+1)
将对增长率进行复合;我使用lag
将第一年的增长设置为0(使其与基线相同)。如果你想使用
accumulate
函数,我认为你需要像这样使用accumulate2()
: