заполнить последовательность даты и времени

У меня есть data.frame, состоящий из идентификаторов, DateTimes и значений. Для каждого идентификатора я хочу расширить DateTimes, чтобы между минимальным и максимальным значениями было одно значение каждый час. Столбцы ID и Value должны быть заполнены соответствующими значениями (т.е. не NA). Никогда не будет случая, когда для каждого идентификатора будет несколько уникальных значений Value. Например, новый data.frame должен иметь 4 строки с ID == 1 и 5 строк с ID == 2 (всего 9 строк). Как это сделать проще всего?

Я обычно работаю с dplyr, поэтому буду принимать как базовые, так и dplyr / tidyverse методы.

library(dplyr)
library(lubridate)

dt <- Sys.time() %>% floor_date('hours')
df <- data.frame(ID = c(1, 1, 2, 2), 
                 DateTime = c(dt, dt + hours(3), dt + hours(6), dt + hours(9)),
                 Value = c(3, 3, 4, 4))

ожидаемый результат:

output <- data.frame(ID = c(1, 1, 1, 1, 2, 2, 2, 2), 
                     DateTime = c(dt, dt + hours(1), dt + hours(2), dt + hours(3), 
                                  dt + hours(6), dt + hours(7), dt + hours(8), dt + hours(9)),
                     Value = c(3, 3, 3, 3, 4, 4, 4, 4))

  ID            DateTime Value
1  1 2018-03-27 19:00:00     3
2  1 2018-03-27 20:00:00     3
3  1 2018-03-27 21:00:00     3
4  1 2018-03-27 22:00:00     3
5  2 2018-03-28 01:00:00     4
6  2 2018-03-28 02:00:00     4
7  2 2018-03-28 03:00:00     4
8  2 2018-03-28 04:00:00     4

person sebdalgarno    schedule 28.03.2018    source источник
comment
Я немного изменил исходный data.frame и предоставил ожидаемый результат   -  person sebdalgarno    schedule 28.03.2018
comment
Мои результаты отличаются от ваших, поскольку другой часовой пояс   -  person akrun    schedule 28.03.2018
comment
да вывод отличается, это не проблема. Мне просто нужно заполнить столбец значения, а также идентификатор   -  person sebdalgarno    schedule 28.03.2018
comment
Если столбец значения одинаков для каждого идентификатора, просто используйте group_by(ID, Value)   -  person akrun    schedule 28.03.2018
comment
отличное спасибо. Хорошее простое решение   -  person sebdalgarno    schedule 28.03.2018


Ответы (1)


Мы можем использовать complete из tidyr

library(tidyverse)
df %>% 
   group_by(ID, Value) %>% 
   complete(DateTime = seq(min(DateTime), max(DateTime), by = "1 hour")) %>%
   select(names(df)) 
person akrun    schedule 28.03.2018
comment
почти. Это решение также не заполняет столбец «Значение». - person sebdalgarno; 28.03.2018
comment
@sebdalgarno В вашем примере столбец «Значение» один и тот же для каждого «ID». Итак, я использовал fill - person akrun; 28.03.2018