我正在计算一个人根据期限,月付款和原始本金获得的贷款利率。例如,一个人可能有120个月的期限,每月支付200美元的贷款,原始本金为10000美元。
我正在使用包RATE
中的optiRum
函数。在上面的示例中,利率为RATE(120, -200, 10000)
= 0.0175(这是每月利率)
现在,有些情况下利率计算失败。例如,在term*monthly_payment < original_principal
的情况下,您无法计算费率。例如,RATE(3, -200, 1000)
会正确抛出错误rate > 0 is not TRUE
。
对于RATE
引发错误的行,我需要tryCatch来存储错误消息,否则它应该计算速率。不幸的是,tryCatch的行为是输入所有行的错误消息。请参阅以下案例以获取示例。
在下面的代码中,我有3个贷款,期限为6,每月支付200,起始本金为1000.所有3个记录的利率应为0.05472。
library(optiRum)
tryCatch(RATE(c(6,6,6), c(-200, -200, -200), c(1000, 1000, 1000)),
error = function(e) "error")
输出:[1] 0.05472 0.05472 0.05472
在下面的代码中,我有2条记录,第6条记录和1条记录,第1条记录。所有记录的每月付款为200,起始本金为1000. 2条记录的利率应为0.05472,对于最后一个它应该只存储一条错误信息。
tryCatch(RATE(c(6,6,1), c(-200, -200, -200), c(1000, 1000, 1000)),
error = function(e) "error")
输出:[1] "error"
预期输出为"0.05472", "0.05472", "error"
,与实际输出不匹配。
我有一个在循环场景中应用tryCatch
的解决方案,但在处理数百万行时,此解决方案不可行。如果有人能告诉我如何对tryCatch行为进行矢量化,将会非常有帮助。
Loopy循环tryCatch:
rate_catch <- function (terms_duration, monthly_payment_amount, original_amount) {
return(tryCatch(RATE(terms_duration, monthly_payment_amount, original_amount), error=function(e) NA))
}
for (i in 1:nrow(df)) {
df[i,4]<-rate_catch(df$terms_duration[i],
-df$monthly_payment_amount[i],
df$original_amount[i])
}