Использование функции Seq в R - PullRequest
0 голосов
/ 14 января 2019

У меня есть фрейм данных с 2 столбцами, датой оценки и датой истечения срока, я хочу создать еще один столбец дат погашения с помощью функции seq в R, передавая дату оценки, дату истечения срока действия и 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)

Для даты проверки 26-06-2018 и даты окончания 30 марта 2018 года, частота = 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 голосов
/ 14 января 2019

Я думаю, что у вас было две проблемы: одна в самой функции, и одна во входах. Во-первых, даты неправильно форматировались внутри функции, что вызывало проблемы для 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
}

Во-вторых, дата окончания, указанная вами в вопросе (30 марта 2018 г.), предшествует дате, которую вы указали. который, я думаю, тоже вызывал проблемы. Вот полный вызов и вывод, который соответствует желаемому результату.

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...