填写日期时间序列

时间:2018-03-28 02:52:05

标签: r dplyr lubridate posixct seq

我有一个由ID,DateTimes和Values组成的data.frame。对于每个ID,我想扩展DateTimes,以便在min和max之间每小时有一个。 ID和Value列应填充各自的值(即不是NA)。永远不会出现每个ID都有多个唯一值的情况。例如,新的data.frame应该有4行ID == 1和5行ID == 2(总共9行)。最简单的方法是什么?

我通常使用dplyr,因此会接受base或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

1 个答案:

答案 0 :(得分:2)

我们可以使用complete

中的tidyr
library(tidyverse)
df %>% 
   group_by(ID, Value) %>% 
   complete(DateTime = seq(min(DateTime), max(DateTime), by = "1 hour")) %>%
   select(names(df))