2016-04-07 17 views
0

を作成するためにループを適用しますループを動かす。 Rは、私は1行目の計算が正常に動作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パーセントだったと言う他のすべての行の1行目の

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)) 

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

答えて

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) 

、それはすべての行の最初のバランスとinterestamountを計算して、上書きされないよう、最善のアプローチではありません、あなたのデータセットが

+0

小さい場合のオーバーヘッドはあまりすべきではない、私はアプローチが好きですが、それが生成する計算は正しくありません。残高が正しく計算されないため、interestAmtは正しい計算をしません。私はあなたのアプローチを使用して、計算が正しいかどうかを調べるつもりです。はい、データセットが小さいことは間違いありません。私はSASでこれを行う方法を知っています。私はR.Ughで計算の順序を理解できません! –

+0

あなたは多分ソリューションは、より正確にされている可能性が前の行または現在の収支計算VALUE_で見つかった_newバランスによってどういう説明していた場合。再生産可能な例が常に役立ちます –

関連する問題