У меня есть фрейм данных, содержащий некоторые ежедневные метки времени в полночь каждого дня и некоторые часовые метки времени в начале каждого часа в течение дня.Я хочу расширить данные так, чтобы это было ежечасно, и я хотел бы сделать это в рамках тидиверс "цепочки труб".
Я думал создать фрейм данных, содержащий полный почасовой временной ряд, а затем dplyr::right_join()
мои данные по этому временному ряду.Я думал, что это будет заполнять правильные значения там, где было совпадение для ежедневных данных (в полночь) и заполнять NA
везде, где не было совпадения (любой час, кроме полуночи).Кажется, это работает только тогда, когда временные ряды в моих данных представлены только по дням, а не как сочетание ежедневных и часовых значений, что было неожиданным.Почему правильное объединение не расширяет дневной временной ряд, когда он сосуществует во фрейме данных вместе с другим часовым временным рядом?
Я создал минимальный пример ниже.Мой репрезентативный набор данных, который я хочу расширить, называется allData
и содержит набор ежедневных и часовых наборов данных из двух разных переменных временных рядов, Daily TS
и Hourly TS
.
dailyData <- data.frame(
DateTime = seq.POSIXt(lubridate::ymd_hms('2019-01-01', truncated=3),
lubridate::ymd_hms('2019-01-07', truncated=3),
by='day'),
Name = 'Daily TS'
)
allHours <- data.frame(
DateTime = seq.POSIXt(lubridate::ymd_hms('2019-01-01', truncated=3),
lubridate::ymd_hms('2019-01-07 23:00:00'),
by='hour')
)
hourlyData <- allHours %>%
dplyr::mutate( Name = 'Hourly TS' )
allData <- rbind( dailyData, hourlyData )
Это дает
head( allData, n=15 )
DateTime Name
1 2019-01-01 00:00:00 Daily TS
2 2019-01-02 00:00:00 Daily TS
3 2019-01-03 00:00:00 Daily TS
4 2019-01-04 00:00:00 Daily TS
5 2019-01-05 00:00:00 Daily TS
6 2019-01-06 00:00:00 Daily TS
7 2019-01-07 00:00:00 Daily TS
8 2019-01-01 00:00:00 Hourly TS
9 2019-01-01 01:00:00 Hourly TS
10 2019-01-01 02:00:00 Hourly TS
11 2019-01-01 03:00:00 Hourly TS
12 2019-01-01 04:00:00 Hourly TS
13 2019-01-01 05:00:00 Hourly TS
14 2019-01-01 06:00:00 Hourly TS
15 2019-01-01 07:00:00 Hourly TS
Теперь я подумал, что dplyr::right_join()
полной часовой последовательности значений POSIXct
против allData$DateTime
расширило бы дневной временной ряд, оставив значения NA для любых часов, явно не представленных в данных,Затем я мог бы использовать tidyr::fill()
, чтобы заполнить их в течение дня.Однако следующий код не ведет себя таким образом:
expanded_BAD <- allData %>%
dplyr::right_join( allHours, by='DateTime' ) %>%
tidyr::fill( dplyr::everything(), .direction='down' ) %>%
dplyr::arrange( Name, DateTime )
expanded_BAD
показывает, что ежедневные данные не были расширены на right_join()
.То есть, часы в allHours
, пропущенные из allData
, не были сохранены в результате, что, как я думал, и было целью использования правильного соединения.Вот заголовок результата:
head(expanded_BAD, n=15)
DateTime Name
1 2019-01-01 00:00:00 Daily TS
2 2019-01-02 00:00:00 Daily TS
3 2019-01-03 00:00:00 Daily TS
4 2019-01-04 00:00:00 Daily TS
5 2019-01-05 00:00:00 Daily TS
6 2019-01-06 00:00:00 Daily TS
7 2019-01-07 00:00:00 Daily TS
8 2019-01-01 00:00:00 Hourly TS
9 2019-01-01 01:00:00 Hourly TS
10 2019-01-01 02:00:00 Hourly TS
11 2019-01-01 03:00:00 Hourly TS
12 2019-01-01 04:00:00 Hourly TS
13 2019-01-01 05:00:00 Hourly TS
14 2019-01-01 06:00:00 Hourly TS
15 2019-01-01 07:00:00 Hourly TS
Интересно, что если мы выполним точно такое же правое объединение только с ежедневными данными, мы получим желаемый результат:
dailyData_expanded_GOOD <- dailyData %>%
dplyr::right_join( allHours, by='DateTime' ) %>%
tidyr::fill( dplyr::everything(), .direction='down' )
Вот заголовок:
head(dailyData_expanded_GOOD, n=15)
DateTime Value
1 2019-01-01 00:00:00 Daily TS
2 2019-01-01 01:00:00 Daily TS
3 2019-01-01 02:00:00 Daily TS
4 2019-01-01 03:00:00 Daily TS
5 2019-01-01 04:00:00 Daily TS
6 2019-01-01 05:00:00 Daily TS
7 2019-01-01 06:00:00 Daily TS
8 2019-01-01 07:00:00 Daily TS
9 2019-01-01 08:00:00 Daily TS
10 2019-01-01 09:00:00 Daily TS
11 2019-01-01 10:00:00 Daily TS
12 2019-01-01 11:00:00 Daily TS
13 2019-01-01 12:00:00 Daily TS
14 2019-01-01 13:00:00 Daily TS
15 2019-01-01 14:00:00 Daily TS
Почему правильное объединение влияет на полные данные по сравнению с ежедневными данными?