R 根据面值数据推断摊销、剩余价值和新贷款

R 根据面值数据推断摊销、剩余价值和新贷款,r,R,我有数据“myinput”,我想用它来获取“myoutput” myinput试试这个。在某种意义上,我的R解决方案与Excel非常相似。添加列并将公式放入单元格中。(;对于扩展数据集的计算,我只需将“公式”放在一个函数中,然后就可以按组应用: df谢谢!这很有魅力。你能看看我在“扩展数据集”中的编辑吗?嗨,Denise。刚刚编辑了代码,以便在扩展的数据集中按组进行计算。我注意到一些组只包含一个观察值,这使得代码产生错误。是否有任何方法可以绕过此操作而不必删除这些组?:)当然。我在代码中添加了一

我有数据“myinput”,我想用它来获取“myoutput”


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)