【问题标题】:Multiply previous row value by constant R将前一行值乘以常数 R
【发布时间】:2016-05-24 18:25:16
【问题描述】:

有一个简单的 R 问题,但似乎找不到答案:

我有一个这样的数据框:

assumption_val year
1.2            2015
0              2016
0              2017
0              2018
0              2019

我希望将每个值比上一年增加 20%,以输出如下内容:

assumption_val year
1.2            2015
1.44           2016
1.73           2017
2.07           2018
2.49           2019

如何引用前一行并将其乘以 1.2 来实现这一点?

谢谢!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您正在寻找cumprod:

    cumprod(rep(1.2, 5))
    

    与其更知名的朋友cumsum 一样,它会累积过去的结果,但它执行的是乘法而不是加法。

    df <- data.frame(assumption_val=cumprod(rep(1.2, 5)), 
                     years=2015:2019)
    

    这些函数的一个很好的概括是Reduce。例如,这里是Reduce 执行此计算。您可以将“*”替换为“+”并拥有cumsum

    Reduce("*", rep(1.2, 5), accumulate = T)
    

    这种方法的一个很好的特点是您可以调整每个时期的增长率。例如,如果您想从 1.5 而不是 1.2 开始,您只需将增长向量调整为 c(1.5, rep(1.2, 4)) 即可计算新的增长,如下所示:

    cumprod(c(1.5, rep(1.2, 4)))
    

    【讨论】:

    • 感谢您的快速回答!新场景 - 第一个假设恰好与您乘以增长率的结果相同。如果第一个值是 1.5,但您仍希望每年增长 20%,代码将如何变化?
    • 查看我添加的答案的底部。
    【解决方案2】:
    data <- read.table(textConnection("
        assumption_val year
        1.2            2015
        0              2016
        0              2017
        0              2018
        0              2019"), header = TRUE)
    
    data$assumption_val <- data$assumption_val[1]^(1:nrow(data))
    
    data
    ##   assumption_val year
    ## 1        1.20000 2015
    ## 2        1.44000 2016
    ## 3        1.72800 2017
    ## 4        2.07360 2018
    ## 5        2.48832 2019
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-10
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      相关资源
      最近更新 更多