是否有函数或方法可以建立公式中的先前值

时间:2019-05-06 19:06:08

标签: r

我试图通过一个公式创建一个新的向量,但是我想将该公式的结果包括在同一向量中的后续值。有一种简单的方法可以使我丢失吗?

我从一个值开始,然后乘以每年更改的百分比(v1)。我可以使它工作,但它只包括该行,我希望它能作为一个总和。我尝试过手动插入第1行的值(1000),然后为剩余的行做一个公式[2:10],但这都不起作用(获取NA),我认为这实际上不会导致我想。初始值应为1000,随后的每个值应以该值和上一行为基础。我希望每一行都从上一行的答案开始,然后乘以百分比。我已经尝试了几种方法并搜索了答案,但是我认为我没有使用正确的术语或某种东西,因为我敢肯定有一种更简单的方法可以做到这一点。这是一个可重现的示例:

    library(dplyr)
    df <- data.frame(Year = c(2010:2019),
             v1 = c(1.05, 1.1, 1.12, 1.15, 1.05, 1.3, 1.2, 1.2, 1.1, 1.1))
    df$v2[1]=1000
    df <- df %>%
      mutate(v2 = v2[2:10] * v1 + v2[1])

预期结果应如下所示。

       Year   v1      v2
    1  2010 1.05 1050.00
    2  2011 1.10 1155.00
    3  2012 1.12 1293.60
    4  2013 1.15 1487.64
    5  2014 1.05 1562.02
    6  2015 1.30 2030.63
    7  2016 1.20 2436.75
    8  2017 1.20 2924.11
    9  2018 1.10 3216.52
    10 2019 1.10 3538.17

所以v2 [1] = 1000 * 1.05,v2 [2] = 1050 * 1.10,v2 [3] = 1155 * 1.12,依此类推。

1 个答案:

答案 0 :(得分:1)

我们可以使用accumulate中的purrr

library(tidyverse)
df %>% 
   mutate(v2 = tail(accumulate(v1, ~ .x * .y, .init = 1000), -1))
#   Year   v1       v2
#1  2010 1.05 1050.000
#2  2011 1.10 1155.000
#3  2012 1.12 1293.600
#4  2013 1.15 1487.640
#5  2014 1.05 1562.022
#6  2015 1.30 2030.629
#7  2016 1.20 2436.754
#8  2017 1.20 2924.105
#9  2018 1.10 3216.516
#10 2019 1.10 3538.167

一个base R选项是

tail(Reduce(function(x, y) x * y, df$v1, init = 1000, accumulate = TRUE), -1)
#[1] 1050.000 1155.000 1293.600 1487.640 1562.022 2030.629 
#[7] 2436.754 2924.105 3216.516 3538.167