Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中应用函数按组将单行扩展为多行_R - Fatal编程技术网

在R中应用函数按组将单行扩展为多行

在R中应用函数按组将单行扩展为多行,r,R,我试图为一个有3个独立账户的数据框创建一个摊销计划。每个帐户都有一行,详细说明帐户的贷款信息,即起始余额、年利率、贷款期限和每年付款 我想做的是,使用我的数据框架中的贷款信息,创建一个贷款分期偿还计划,以详细说明贷款期间所需的每月付款。下面是一个计算总付款、本金付款和利息付款的函数。我希望将该函数应用于我的数据框中的帐户。我最近的一次尝试是使用dplyr::group_by函数,但我的代码似乎不适用于具有多个帐户的数据帧,而适用于单个帐户 我希望得到一些帮助,我很确定问题在于如何调用函数和分组,

我试图为一个有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()
q%
突变(测试=map(quux,摊销计划(起始余额,年利率,支付频率,支付次数)))%>%
未测试(测试)%>%
解组()

您可以使用
apply
通过设置
MARGIN=1将函数应用于数据帧的每一行。下面是一个示例函数,它获取数据框并返回数据框中每个人的摊销计划列表。它的工作方式是按
摊销计划
获取参数的顺序排列列,然后使用
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)