R语言 将增长率有条件地应用于数据框内的给定初始值

nbnkbykc  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(97)

抱歉,如果这是一个基本的问题,但我根本不能弄清楚这一个作为一个初学者-我试图找到类似的问题,但没有成功...
我有一个以下数据框架,其中每个产品和每个地区组合的增长率都在变化,并且在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中选择,而不是我手动输入,因为这显然不适用于将新产品和地区组合引入增长率变化的数据框。
非常感谢您的帮助!

x9ybnkn6

x9ybnkn61#

你可以用group_bycumprod来实现。cumprod(growth+1)将对增长率进行复合;我使用lag将第一年的增长设置为0(使其与基线相同)。

dat |> 
  group_by(product, region) |> 
  mutate(sales_projected = sales[1] * cumprod(lag(growth, default = 0)+1))
# A tibble: 13 × 7
# Groups:   product, region [2]
   product  region   year growth sales sales_expected sales_projected
   <chr>    <chr>   <int>  <dbl> <int>          <int>           <dbl>
 1 productA regionA  2023   0.1    100            100            100 
 2 productA regionA  2024   0.1     NA            110            110 
 3 productA regionA  2025   0.1     NA            121            121 
 4 productA regionA  2026   0.1     NA            133            133.
 5 productA regionA  2027   0.1     NA            146            146.
 6 productA regionA  2028   0.1     NA            161            161.
 7 productA regionA  2029   0.1     NA            177            177.
 8 productA regionA  2030   0.1     NA            195            195.
 9 productA regionA  2031   0.1     NA            214            214.
10 productA regionA  2032   0.1     NA            236            236.
11 productA regionB  2023   0.06   100            100            100 
12 productA regionB  2024   0.06    NA            106            106 
13 productA regionB  2025   0.06    NA            112            112.

如果你想使用accumulate函数,我认为你需要像这样使用accumulate2()

dat |> 
  group_by(product, region) |> 
  mutate(sales_expected = accumulate2(sales, growth[-1], \(x,y,g) x*(1+g)))
# A tibble: 13 × 7
# Groups:   product, region [2]
   product  region   year growth sales sales_expected sales_projected
   <chr>    <chr>   <int>  <dbl> <int>          <int>           <dbl>
 1 productA regionA  2023   0.1    100            100            100 
 2 productA regionA  2024   0.1     NA            110            110 
 3 productA regionA  2025   0.1     NA            121            121 
 4 productA regionA  2026   0.1     NA            133            133.
 5 productA regionA  2027   0.1     NA            146            146.
 6 productA regionA  2028   0.1     NA            161            161.
 7 productA regionA  2029   0.1     NA            177            177.
 8 productA regionA  2030   0.1     NA            195            195.
 9 productA regionA  2031   0.1     NA            214            214.
10 productA regionA  2032   0.1     NA            236            236.
11 productA regionB  2023   0.06   100            100            100 
12 productA regionB  2024   0.06    NA            106            106 
13 productA regionB  2025   0.06    NA            112            112.

相关问题