Есть ли функция или способ построить предыдущие значения в формулах - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь создать новый вектор по формуле, но я хочу включить результат этой формулы для последующих значений в том же векторе.Есть ли простой способ сделать это, что мне не хватает?

Я начинаю с одного значения, а затем умножаю его на процент (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 Ответ

1 голос
/ 06 мая 2019

Мы можем использовать 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

A 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...