抱歉,如果这是一个基本的问题,但我只是不能解决这个问题作为一个初学者-我试图找到类似的问题,但没有成功…

我有一个下面的数据框,其中每个产品和每个地区的组合的增长率都会变化,并在10年内保持不变(我从另一个数据框中离开_加入它).

我只有本年度的销售额,并希望预测10年来使用增长率给出试图产生的结果在sales_expected.

product region year growth sales sales_expected
productA regionA 2023 0.1 100 100
productA regionA 2024 0.1 110
productA regionA 2025 0.1 121
productA regionA 2026 0.1 133
productA regionA 2027 0.1 146
productA regionA 2028 0.1 161
productA regionA 2029 0.1 177
productA regionA 2030 0.1 195
productA regionA 2031 0.1 214
productA regionA 2032 0.1 236
productA regionB 2023 0.06 100 100
productA regionB 2024 0.06 106
productA regionB 2025 0.06 112
... ... ... ...

在我的管道中,我try 使用从purr开始累积的包:

mutate(sales_expected = accumulate(sales, fill_in))

与查找sales列内的下一个n.a并应用增长率的fill_in函数相结合:


fill_in <- function(prev, new, growth) {
  growth_rate <- 0.1
  if_else(!is.na(new), new, prev * (1 + growth_rate))
}

这是可行的,但我搞不懂的是如何有条件地更改此函数中的growth_rate 参数,即它应该从第growth列中选取,而不是我手动键入,因为这显然不适用于将新的产品和区域组合引入增长率变化的数据框中.

非常感谢你的帮助!

推荐答案

你可以用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.

R相关问答推荐

如何删除多个.CSV文件的行

在R中列表的结尾添加数字载体

R:更新后无法运行控制台

大规模重新标记haven标签数据

使用tidyverse方法绑定行并从一组管道列表执行左连接

过滤器数据.基于两列的帧行和R中的外部向量

隐藏e_mark_line的工具提示

r替换lme S4对象的字符串的一部分

删除列表中存储的数据帧内和数据帧之间的重复行

使用strsplit()将向量操作为数据框

在R中无法读入具有Readxl和lApply的数据集

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

用关联字符串替换列名的元素

根据列A中的差异变异列,其中行由列B中的相对值标识

是否有可能从边界中找到一个点值?

避免在图例中显示VLINS组

在r中整理图例和堆叠图的问题

即使使用相同的种子,mtry值也取决于TuneGrid范围

如何在用`{{ }}`创建的变量上使用整洁 Select ?

如何在甜甜圈图表中隐藏标签之外