R 根据面值数据推断摊销、剩余价值和新贷款
我有数据“myinput”,我想用它来获取“myoutput”R 根据面值数据推断摊销、剩余价值和新贷款,r,R,我有数据“myinput”,我想用它来获取“myoutput” myinput试试这个。在某种意义上,我的R解决方案与Excel非常相似。添加列并将公式放入单元格中。(;对于扩展数据集的计算,我只需将“公式”放在一个函数中,然后就可以按组应用: df谢谢!这很有魅力。你能看看我在“扩展数据集”中的编辑吗?嗨,Denise。刚刚编辑了代码,以便在扩展的数据集中按组进行计算。我注意到一些组只包含一个观察值,这使得代码产生错误。是否有任何方法可以绕过此操作而不必删除这些组?:)当然。我在代码中添加了一
myinput试试这个。在某种意义上,我的R解决方案与Excel非常相似。添加列并将公式放入单元格中。(;对于扩展数据集的计算,我只需将“公式”放在一个函数中,然后就可以按组应用:
df谢谢!这很有魅力。你能看看我在“扩展数据集”中的编辑吗?嗨,Denise。刚刚编辑了代码,以便在扩展的数据集中按组进行计算。我注意到一些组只包含一个观察值,这使得代码产生错误。是否有任何方法可以绕过此操作而不必删除这些组?:)当然。我在代码中添加了一个if(nrow(results)>1)
。这可以防止对只有一个OB的组执行带有问题的seq(2,nrow(results))
的for循环。现在,即使只有一个obs.Hi@stefan的组,代码也可以正常工作。对不起,我不想打扰你,但我真的很想让它发挥作用。我注意到,如果我在一组中有两个面值为零的观察值,循环会返回不需要的值(当面值返回非零时,这也会影响以后的计算)。我尝试了next的一些变体,但不起作用。你能想出解决这个问题的办法吗?
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))
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)