Я пытаюсь написать рекурсивную функцию для накопления учетной стоимости инвестиционного продукта, но одно из значений в моем накоплении зависит от предыдущих условий рекурсии. В частности, мне нужно рассчитать значение требуемого минимального распределения со счета, который должен быть снят 15 мая, и рассчитывается в процентах от стоимости счета в начале года. Затем это значение будет отозвано и впоследствии уменьшит стоимость счета 15 мая.
Вот что я пробовал:
library(tidyverse)
library(lubridate)
set.seed(123)
example.df<-data.frame(Date=seq.Date(Sys.Date(), by='day', length.out = 1000)) %>%
mutate(Age=floor(((Sys.Date() %m+% years(-70)) %--% Date)/years(1))) %>%
mutate(InitialBalance=100000,
rmd.factor=if_else(month(Date)==5 & day(Date)==15, .05+(Age-70)*.02, 0),
InterestCredited=if_else(month(Date)==4 & day(Date)==22 & row_number()>1, runif(n())*.2, 0)) %>%
left_join({.} %>%
sample_n(10) %>%
select(Date) %>%
mutate(Withdrawal=runif(n())*10000), by='Date') %>%
replace_na(replace=list(Withdrawal=0)) %>%
group_by(year(Date)) %>%
mutate(YearDay=row_number()-1) %>%
ungroup() %>%
mutate(Test=row_number())
output.df<-example.df %>%
nest() %>%
mutate(AVAccumulate=map(data, function(data) unlist(accumulate(
.x=data$Test,
.f=function(p, x){
(p-data$Withdrawal[x]-data$rmd.factor[x]*lag(p, data$YearDay[x]))*(1+data$InterestCredited[x])
},
.init=data$InitialBalance[1])[2:(nrow(data)+1)]))) %>%
unnest()
head(output.df)
Это явно не работает, как только первый срок в рекурсии нет ошибки Если я удалю вычисление RMD, рекурсия сработает:
output.df2<-example.df %>%
nest() %>%
mutate(AVAccumulate=map(data, function(data) unlist(accumulate(
.x=data$Test,
.f=function(p, x){
(p-data$Withdrawal[x])*(1+data$InterestCredited[x])
},
.init=data$InitialBalance[1])[2:(nrow(data)+1)]))) %>%
unnest()
head(output.df2)
Похоже, у меня нет доступа к "p" в функции накопления как к вектору, а скорее как к последнему значению. Есть ли способ получить доступ к предыдущим значениям "p"?
Кроме того, есть ли способ просто использовать фрейм данных в качестве моего аргумента "x" вместо вектора индекса? То, что я делаю, кажется немного неуклюжим и напоминает о-1012 *, от которого я пытаюсь избавиться.