У меня есть 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, и получить правильные даты в случае окончания месяца.