Преобразование квартальных данных в ежемесячные данные - PullRequest
0 голосов
/ 04 мая 2018

Я получил следующие данные с квартальными данными:

set.seed(1)
DT <- data.table(dates=c(as.Date("1983-03-31"), as.Date("1983-06-30"), as.Date("1983-09-30"), 
               as.Date("1983-12-31"), as.Date("1984-03-31"), as.Date("1984-06-30"),
               as.Date("1984-09-30"), as.Date("1984-12-31"), as.Date("1985-03-31"), 
               as.Date("1985-06-30"), as.Date("1985-09-30")),
       var=rnorm(11))
DT
# desired outout: (extract)
data.table(dates=c(as.Date("1983-01-31"), as.Date("1983-02-28"), as.Date("1983-03-31")),quarter=rep(as.Date("1983-03-31"),3), 
               var=rep(-0.6264538,3))

Я хотел бы создать месячный набор данных из квартального, скопировав соответствующие квартальные значения 3 раза за соответствующие месяцы. Соответствующие месяцы в формате Date должны быть созданы в первую очередь, так как они должны использоваться позже в анализе. Можно ли это легко сделать с помощью какого-то соединения? Я только нашел способы сделать это наоборот, то есть от ежемесячного к квартальному с помощью агрегации.

Предпочтительно с помощью datatable. Спасибо за любые подсказки.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы можете перечислить нужные даты и сделать переходное соединение:

DT[.(seq(as.IDate("1983-02-01"), as.IDate("1985-10-01"), by="month") - 1L), 
  on=.(dates), roll=-Inf]

         dates        var
 1: 1983-01-31 -0.6264538
 2: 1983-02-28 -0.6264538
 3: 1983-03-31 -0.6264538
 4: 1983-04-30  0.1836433
 5: 1983-05-31  0.1836433
 6: 1983-06-30  0.1836433
 7: 1983-07-31 -0.8356286
 8: 1983-08-31 -0.8356286
 9: 1983-09-30 -0.8356286
10: 1983-10-31  1.5952808
11: 1983-11-30  1.5952808
12: 1983-12-31  1.5952808
13: 1984-01-31  0.3295078
14: 1984-02-29  0.3295078
15: 1984-03-31  0.3295078
16: 1984-04-30 -0.8204684
17: 1984-05-31 -0.8204684
18: 1984-06-30 -0.8204684
19: 1984-07-31  0.4874291
20: 1984-08-31  0.4874291
21: 1984-09-30  0.4874291
22: 1984-10-31  0.7383247
23: 1984-11-30  0.7383247
24: 1984-12-31  0.7383247
25: 1985-01-31  0.5757814
26: 1985-02-28  0.5757814
27: 1985-03-31  0.5757814
28: 1985-04-30 -0.3053884
29: 1985-05-31 -0.3053884
30: 1985-06-30 -0.3053884
31: 1985-07-31  1.5117812
32: 1985-08-31  1.5117812
33: 1985-09-30  1.5117812
         dates        var

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

0 голосов
/ 04 мая 2018

Вот опция data.table с некоторыми добавленными функциями смазки. Возможно, есть более прямой путь, но это, вероятно, тоже подойдет:

library(lubridate)
DT <- DT[rep(1:.N, each = 3)]
DT[, quarter := dates]
DT[, dates := {day(dates) <- 1; dates}]
DT[, dates := {month(dates) <- month(dates) - 1:(-1); dates}, by = quarter]
DT[, dates := dates -1]

Сначала мы копируем каждую строку три раза. Затем мы создаем копию столбца дат для кварталов. Далее мы устанавливаем дату первого дня месяца. Затем мы вычитаем 1, 0, -1 месяц из каждой даты и, наконец, вычитаем один день, чтобы прибыть в последний день предыдущего месяца.

head(DT)
#       quarter        var      dates
# 1: 1983-03-31 -0.6264538 1983-01-31
# 2: 1983-03-31 -0.6264538 1983-02-28
# 3: 1983-03-31 -0.6264538 1983-03-31
# 4: 1983-06-30  0.1836433 1983-04-30
# 5: 1983-06-30  0.1836433 1983-05-31
# 6: 1983-06-30  0.1836433 1983-06-30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...