我有2个约会和一个频率。以最终日期为准,然后每12个月返回一次,直到结果日期小于开始日期为止。 (在示例1下面)。
我有一个代码,可以工作,但是速度很慢,因为要利用while循环。 也有一个例外,例如:如果最后日期是月份的最后一天,则所有其他日期也应该是相应月份的最后一天。但是我的代码没有做最后一部分。 (在示例2下)
cpdatesfun<- function(sdate, fdate, frq = 2){
m <- month(fdate)
y <- year(fdate)
d <- day(fdate)
cp <- fdate
dcp <- c()# null
while (as.numeric(cp - sdate)>=0) { #Kind of recursive
dcp <- ymd(dcp, cp)
y = ifelse(m-12/frq <= 0,y-1, y)
m = ifelse(m-12/frq <= 0, 12 + m-12/frq, m-12/frq)
dm <- days_in_month(make_date(year = y, month = m, day = 1))
d = ifelse(dm<d, dm,d)
cp <- make_date(year = y, month = m, day = d)
}
return(sort(dcp))
}
cpdatesfun(dmy(150119), dmy(200220)) #Example #1 good
cpdatesfun(dmy(150119), dmy(280220)) # Example #2 wrong
[1]“ 2019-02-20”“ 2019-08-20”“ 2020-02-20” [1]“ 2019-02-28”“ 2019-08-28”“ 2020-02-28”
示例2中正确的结果应该是 [1]“ 2019-02-28”“ 2019-08-31”“ 2020-02-28”
我想要一种比while循环更快的方法,并在月末时获得正确的日期。
答案 0 :(得分:0)
基数R中有一个名为seq.Date
的函数,该函数可以获取开始日期和结束日期并创建日期向量。现在将其放入函数中,您可以尝试执行以下操作:
cpdatesfun <- function(sdate, fdate, frq = 2){
require(lubridate)
kdate <- ceiling_date(as.Date(fdate), unit = "month") - days(1)
sdate <- as.Date(sdate)
newdate <- kdate - years(1)
vec_date <- seq.Date(newdate, kdate, length.out = frq+1)
fin_date <- vec_date[which(vec_date >= sdate)]
return(fin_date)
}
让我知道这是怎么回事:我可能需要进行更正。