0

R で償却計算を作成する必要があります。最初の行の計算は正常に機能しますが、後続のすべての計算では、計算された値または最初の行の値を使用する必要があり、ループを機能させることができません。

df <- data.frame(
  LoanID = c("LN-000249", "LN-000249", "LN-000249", "LN-000249"),
  apply_date = c("2015-07-30 UTC", "2015-09-03 UTC", "2015-11-09 UTC", "2015-11-18 UTC"),
  pmt_amt = c(17292.45, 17153.90, 18100.00,   107.23),
  rows = c(1, 2, 3, 4),
  calc_days = c(41, 35, 67,  9)
                 )

ローンの価値が 50000 で、金利が 0.08% だったとします。

ln_amt = 50000
ln_interest_rate = .08

最初の行の計算

df$interestAmt <- ln_amt * ln_interest_rate / 360 * df$calc_days
df$principalAmt <- df$pmt_amt - df$interestAmt
df$balance <- ln_amt - df$principalAmt

他のすべての行の計算

df$interestAmt <- (new balance found in previous row or current balance calculation value) * ln_interest_rate / 360 * df$calc_days
df$principalAmt <- df$pmt_amt - df$interestAmt
df$balance <- (new balance found in previous row ) - df$principalAmt
 # or it is equal to the (ln_amt - cumsum(df$principalAmt) )

最初の行だけでなく、すべての行の計算を行い、データフレームを作成する方法を理解する必要があります。計算された支払い額ではなく、現在の残高と計算日、および実際の支払いに基づいて償却計算を行う必要があります。したがって、式を使用してこれらの値を取得することはできません。2 ~ 4 行目で、interestAmt または balance の正しい値を取得できないようです。

4

1 に答える 1

0
df2<-df %>% mutate(interestAmt <- ln_amt * ln_interest_rate/360*calc_days,
principalAmt = pmt_amt - interestAmt,
balance  = ln_amt - principalAmt) %>% mutate(interestAmt =(ifelse(is.na(lag(balance,1)),balance,lag(balance,1))) * ln_interest_rate/360*calc_days,
principalAmt = pmt_amt - interestAmt,
balance = lag(balance,1) - principalAmt)

すべての行の初期残高と利息額を計算してから上書きするため、最善のアプローチではありません。データセットが小さい場合、オーバーヘッドはそれほど大きくないはずです

于 2016-04-07T11:04:20.487 に答える