【问题标题】:Applying a Function to Expand a Single Row to Many Rows by Group in R在R中应用函数将单行按组扩展到多行
【发布时间】:2021-03-09 02:53:31
【问题描述】:

我正在尝试为具有 3 个单独帐户的数据框创建摊销计划。每个帐户都有一行详细说明帐户的贷款信息,即起始余额、年利率、贷款期限和每年的付款。

我想要做的是,使用我的数据框中的贷款信息,创建一个贷款摊销时间表,以详细说明贷款期间所需的每月付款。我下面是一个计算总付款、本金支付和利息支付的函数。我想要的是将该函数应用于我的数据框中的帐户。我最近的尝试是使用 dplyr::group_by 函数,但我的代码似乎不适用于具有多个帐户的数据框,而它适用于单个帐户。

我希望能得到一些帮助,我很确定问题是我如何调用函数和分组,但我不太确定。任何帮助深表感谢!谢谢!

q<-data.frame(PersonID=c("A","B","C"),
              StartingBalance=c(100,900,500),
              AnnualRate=c(.02,.05,.04),
              NumberOfPayments=c(60,60,60),
              PaymentFrequency=c(12,12,12))

amortisationschedule <- function(amount, annualinterestrate, paymentsperyear, years) {
  
  nper = paymentsperyear * years
  rate = annualinterestrate / paymentsperyear
  
  AmortisationSchedule <- tibble(
    Principal = map_dbl(1:nper, function(x)
      PPMT(rate,
           x,
           nper,
           amount)),
    
    Interest = map_dbl(1:nper, function(x)
      IPMT(rate,
           x,
           nper,
           amount))
  ) %>% mutate(Instalment = Principal + Interest,
               Balance = round(amount + cumsum(Principal),2))
  
  return(AmortisationSchedule)
}

q2<-q %>%
  group_by(PersonID) %>%
  nest(test = c(-PersonID)) %>%
  mutate(test = map(quux, amortisationschedule(StartingBalance,AnnualRate,PaymentFrequency,NumberOfPayments))) %>%
  unnest(test) %>%
  ungroup()

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用apply 通过设置MARGIN=1 将函数应用于数据框的每一行。以下是一个示例函数,它采用数据框并返回数据框中每个人的摊销时间表列表。它的工作原理是按照amortisationschedule 接受参数的顺序排列列,然后使用apply 在每一行上调用函数。

    amortisation_list=function(dt) {
      dt1=relocate(dt, PaymentFrequency, .before=NumberOfPayments) %>%
      select(-PersonID)
    
      x=apply(dt1, 1, function(x) {
        do.call(amortisationschedule, unname(as.list(unlist(x))))
      })
      return(x)
    }
    amortisation_list(q)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 2021-05-26
      • 2018-11-02
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多