Как расширить временной ряд в R - PullRequest
0 голосов
/ 21 марта 2019

Обратите внимание это не дубликат других вопросов расширения временных рядов.Дата начала и окончания не указана, она основана на значении количества дней в месяце и повторяющихся месяцев.

Допустим, у меня есть следующий набор данных:

  dates<-c("2019-01-07", "2019-02-07", "2019-03-07", "2019-01-22", "2019-02-25")
  month<-c("Jan", "Feb", "March", "Jan", "Feb")
  no_days_PerMonth <-c(31, 28, 31, 31, 28)
  values<-c(54,89,100, 50, 6)
  (test<-as.data.frame(cbind(dates, no_days_PerMonth, month, values)))

     dates    no_days_PerMonth month values
1 2019-01-07               31   Jan     54
2 2019-02-07               28   Feb     89
3 2019-03-07               31 March    100
4 2019-01-22               31   Jan     50
5 2019-02-25               28   Feb      6

То, что я хотел бы сделать, это создать новый фрейм данных, который принимает количество дней в месяце переменной dates и увеличивает число строк, чтобы соответствовать определенному количеству дней в этом месяце и отображать столбец values к каждому новому ряду.Я хочу что-то вроде следующего:

dates     no_days_PerMonth month values new_date
2019-01-07               31   Jan     54    2019-01-01
2019-01-07               31   Jan     54    2019-01-02
2019-01-07               31   Jan     54    2019-01-03
2019-01-07               31   Jan     54    2019-01-04
2019-01-07               31   Jan     54    2019-01-05
2019-01-07               31   Jan     54    2019-01-06
2019-01-07               31   Jan     54    2019-01-07
2019-01-07               31   Jan     54    2019-01-08
2019-01-07               31   Jan     54    2019-01-09
2019-01-07               31   Jan     54    2019-01-10
2019-01-07               31   Jan     54    2019-01-11
2019-01-07               31   Jan     54    .
2019-01-07               31   Jan     54    .
2019-01-07               31   Jan     54    .
2019-01-07               31   Jan     54    
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-01-07               31   Jan     54
2019-02-07               28   Feb     89    2019-02-01
2019-02-07               28   Feb     89    2019-02-02
2019-02-07               28   Feb     89    2019-02-03
2019-02-07               28   Feb     89    2019-02-04
2019-02-07               28   Feb     89    2019-02-05
2019-02-07               28   Feb     89    2019-02-06
2019-02-07               28   Feb     89    2019-02-07
2019-02-07               28   Feb     89    2019-02-08
2019-02-07               28   Feb     89    2019-02-09
2019-02-07               28   Feb     89    2019-02-10
2019-02-07               28   Feb     89    .
2019-02-07               28   Feb     89    .
2019-02-07               28   Feb     89    .
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89
2019-02-07               28   Feb     89

"..." просто представляет продолжение расширения данных (я не хотел тратить время на то, чтобы все это выписать).Кроме того, в приведенном ниже примере набора данных расширение показано только для первых двух дат в исходном наборе данных, потому что мне не хотелось тратить время на то, чтобы все это записать.

1 Ответ

1 голос
/ 21 марта 2019

Вот решение data.table плюс lubridate

library(data.table)
library(lubridate)
setDT(test)[, .(dates, no_days_PerMonth, month, values, new_date = seq(
    floor_date(as.Date(dates), "month"),
    floor_date(as.Date(dates), "month") %m+% days(as.numeric(as.character(no_days_PerMonth))),
    by = "day")), by = dates]
#        dates      dates no_days_PerMonth month values   new_date
#1: 2019-01-07 2019-01-07               31   Jan     54 2019-01-01
#2: 2019-01-07 2019-01-07               31   Jan     54 2019-01-02
#3: 2019-01-07 2019-01-07               31   Jan     54 2019-01-03
#4: 2019-01-07 2019-01-07               31   Jan     54 2019-01-04
#5: 2019-01-07 2019-01-07               31   Jan     54 2019-01-05
#---
#150: 2019-02-25 2019-02-25               28   Feb      6 2019-02-25
#151: 2019-02-25 2019-02-25               28   Feb      6 2019-02-26
#152: 2019-02-25 2019-02-25               28   Feb      6 2019-02-27
#153: 2019-02-25 2019-02-25               28   Feb      6 2019-02-28
#154: 2019-02-25 2019-02-25               28   Feb      6 2019-03-01

Объяснение: Мы используем floor_date, чтобы получить первый день месяца из dates, затем мы расширяем dates, используяseq.Date с первого дня месяца до первого дня месяца с dates плюс no_days_PerMonth.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...