У меня есть данные «myinput», которые я хотел бы использовать для получения «myoutput».
myinput <- data.frame("Date" = c("1997-03-31", "1997-06-30", "1997-09-30", "1997-12-31", "1998-03-31"), "Face value" = c(15, 10, 12, 7, 7))
myoutput <- data.frame("Date" = c("1997-03-31", "1997-06-30", "1997-09-30", "1997-12-31", "1998-03-31"), "Face value" = c(15, 10, 12, 7, 7), "Amortisation" = c(0, 7.5, 8.75, 6.625, 6.1875), "Remaining value" = c(0, 7.5, 1.25, 5.375, 0.8125), "New loans" = c(15, 2.5, 10.75, 1.625, 6.1875))
- Срок погашения всех ссуд составляет шесть месяцев.
- Мы предполагаем, что новые ссуды на первую дату являются номинальной стоимостью на первую дату, то есть 15. Таким образом, каждая амортизация представляет собой сумму новых кредитов двух предыдущих периодов, разделенную на два, например, амортизация на дату 1998-03-31 гг. равна (10,75 + 1,625) /2.
- Кроме того, каждая оставшаяся стоимость равна сумма всех предыдущих новых кредитов (за исключением сегодняшнего нового кредита), вычитаемая из совокупной суммы амортизаций (включая сегодняшнюю амортизацию). Например, оставшееся значение на дату 1998-03-31 составляет (15 + 2,5 + 10,75 + 1,625) - (0 + 7,5 + 8,75 + 6,625 + 6,1875).
- Наконец, новые кредиты (после первое свидание) - это текущая номинальная стоимость за вычетом сегодняшней оставшейся стоимости.
Когда я делаю это в Excel, все работает хорошо, но мне трудно делать то же самое в R.
Любая помощь в том, как я могу написать этот код, будет очень полезной. оценили. Спасибо.
* Расширенный набор данных *
Я расширил свой набор данных, включив в него несколько групп (группа 1, группа 2 и т. Д. c). Каждая группа содержит номинал для каждой даты. Данные структурированы следующим образом:
df <- data.frame("Date" = c(2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 2003),
"Face.value" = c(2, 5, 2, 3, 6, 4, 6, 7, 3),
"Group" = c(1, 1, 1, 2, 2, 2, 3, 3, 3))
Мне нужно запустить итерацию, предоставленную Стефаном для всех групп. Другими словами, мне нужно найти амортизацию, остаточную стоимость и новые кредиты для каждой группы и каждой даты. Есть какой-либо способ сделать это? Спасибо.
* Пример *
df <- data.frame("Date" = c(2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 2003, 2004, 2005),
"Face.value" = c(2, 5, 2, 3, 6, 4, 6, 7, 3, 0, 3, 0, 5, 7),
"Group" = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4))
comp_results <- function(input) {
## input
results <- input
## add results columns + temporary helper vars for New loans in previous periods
results[c("Amortisation", "Remaining.value", "New.loans", "New.loans.lag", "New.loans.lag2","New.loans.lag3","New.loans.lag4","New.loans.lag5","New.loans.lag6","New.loans.lag7","New.loans.lag8")] <- 0
# Init value for new.loans in first period
results[1, "New.loans"] <- results[1, "Face.value"]
# Iterate over periods 2, ...
if (nrow(results) > 1) {
for (i in seq(2, nrow(results))) {
# Put the formulas in cells
results[i, "New.loans.lag"] <- results[i - 1, "New.loans"]
results[i, "New.loans.lag2"] <- results[i - 1, "New.loans.lag"]
results[i, "New.loans.lag3"] <- results[i - 1, "New.loans.lag2"]
results[i, "New.loans.lag4"] <- results[i - 1, "New.loans.lag3"]
results[i, "New.loans.lag5"] <- results[i - 1, "New.loans.lag4"]
results[i, "New.loans.lag6"] <- results[i - 1, "New.loans.lag5"]
results[i, "New.loans.lag7"] <- results[i - 1, "New.loans.lag6"]
results[i, "New.loans.lag8"] <- results[i - 1, "New.loans.lag7"]
# If Face Value in previous period = 0: No amortisation takes place
if (results[i - 1, "Face.value"] > 0) {
results[i, "Amortisation"] <- (results[i, "New.loans.lag"] + results[i, "New.loans.lag2"] + results[i, "New.loans.lag3"] + results[i, "New.loans.lag4"] + results[i, "New.loans.lag5"] + results[i, "New.loans.lag6"] + results[i, "New.loans.lag7"] + results[i, "New.loans.lag8"]) * (3/24)
} else {
results[i, "Amortisation"] <- 0
}
results[i, "Remaining.value"] <- sum(results[1:i, "New.loans.lag"]) - sum(results[1:i, "Amortisation"])
results[i, "New.loans"] <- results[i, "Face.value"] - results[i, "Remaining.value"]
# If Amortisation rule results in negative new loans: Adjust the amortisation
if (results[i, "New.loans"] < 0 & results[i, "Face.value"] == 0) {
results[i, "New.loans"] <- 0
results[i, "Remaining.value"] <- results[i, "Face.value"]
results[i, "Amortisation"] <- sum(results[1:i, "New.loans.lag"]) -
sum(results[1:(i-1), "Amortisation"]) -
results[i, "Remaining.value"]
}
}
}
# Drop temporary vars
results[c("New.loans.lag", "New.loans.lag2", "New.loans.lag3", "New.loans.lag4", "New.loans.lag5", "New.loans.lag6", "New.loans.lag7", "New.loans.lag8")] <- NULL
# Output
results
}
df_split <- split(df, df$Group)
df_results <- lapply(df_split, comp_results)
df_results <- bind_rows(df_results)