在R中使用Seq函数

时间:2019-01-14 17:18:34

标签: r

我有一个包含2列(评估日期和到期日期)的数据框,我想通过R中的seq函数创建另一个列还款日期,传递评估日期,到期日期和by=1/freq

下面是我编写的通过seq函数创建日期的函数:

我收到以下错误

  

seq.default(as.yearmon(st),as.yearmon(en),by = 1 / freq)中的错误:   “ by”的长度必须为1

DateSeq <- function(st, en, freq) {
  freq <- ifelse(freq > 0, freq, 1) 
  st <- as.Date(st) 
  en <- as.Date(en) 
  dateseq <- as.Date(seq(as.yearmon(st), as.yearmon(en), by = 1/freq), frac = 1)
  #if (st!=dateseq[1]){dateseq<-c(st,dateseq)} 
  dateseq[1] <- st 
  if (en > dateseq[length(dateseq)]) { 
    dateseq <- c(dateseq, en) 
  } 
  if (en < dateseq[length(dateseq)]) { 
    dateseq <- c(dateseq[-length(dateseq)], en) 
  } 
  dateseq 
}

repayment_dates <- DateSeq(s, e, f)

对于有效日期为2018年6月6日,有效期为2018年3月30日,频率为12,我应该得到

26-06-2018
31-07-2018
31-08-2018
30-09-2018
31-10-2018
30-11-2018
31-12-2018
31-01-2019
28-02-2019
31-03-2019
30-04-2019
31-05-2019
30-06-2019
31-07-2019
31-08-2019
30-09-2019
31-10-2019
30-11-2019
31-12-2019
31-01-2020
29-02-2020
30-03-2020

1 个答案:

答案 0 :(得分:0)

我认为您有两个问题:一个问题在函数本身中,另一个在输入中。首先,日期在函数中的格式不正确,这给seq()带来了麻烦,并引发了与by参数有关的错误。您需要告诉as.Date()您提供的日期的格式,所以这里有一个完整的(修订版)功能:

DateSeq <- function(st, en, freq) {
  library(zoo)
  freq <- ifelse(freq > 0, freq, 1) 
  st <- as.Date(st, format="%d-%m-%Y") 
  en <- as.Date(en, format="%d-%m-%Y") 
  dateseq <- as.Date(seq(as.yearmon(st), as.yearmon(en), by = 1/freq), frac = 1)
  #if (st!=dateseq[1]){dateseq<-c(st,dateseq)} 
  dateseq[1] <- st 
  if (en > dateseq[length(dateseq)]) { 
    dateseq <- c(dateseq, en) 
  } 
  if (en < dateseq[length(dateseq)]) { 
    dateseq <- c(dateseq[-length(dateseq)], en) 
  } 
  dateseq
}

第二,您在问题中提供的结束日期(2018年3月30日)早于您提供的开始日期。我认为这也引起了问题。这是一个完整的调用和输出,与您所需的输出匹配。

s <- "26-06-2018"
e <- "30-03-2020"
f <- 12
repayment_dates <- DateSeq(s, e, f)

#Output
> repayment_dates
 [1] "2018-06-26" "2018-07-31" "2018-08-31" "2018-09-30" "2018-10-31" "2018-11-30"
 [7] "2018-12-31" "2019-01-31" "2019-02-28" "2019-03-31" "2019-04-30" "2019-05-31"
[13] "2019-06-30" "2019-07-31" "2019-08-31" "2019-09-30" "2019-10-31" "2019-11-30"
[19] "2019-12-31" "2020-01-31" "2020-02-29" "2020-03-30"