我有一个包含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
答案 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"