日期时间序列填充

5
我有一个数据框,包括ID、日期时间和数值。对于每个ID,我想展开DateTimes,使得在最小值和最大值之间每小时都有一个。ID和Value列应该填充它们各自的值(即不是NA)。永远不会出现每个ID有多个唯一Value值的情况。例如,新的数据框应该有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

1
我稍微修改了原始数据框并提供了预期输出。 - sebdalgarno
我的输出与你的不同,因为时区不同。 - akrun
是的,输出不同并不是问题。我只需要填写“值”列以及“ID”。 - sebdalgarno
如果每个ID的Value列都相同,只需使用group_by(ID, Value) - akrun
1
完美,谢谢。这是一个不错的简单解决方案。 - sebdalgarno
1个回答

5
我们可以使用来自 tidyr 的 complete 。
library(tidyverse)
df %>% 
   group_by(ID, Value) %>% 
   complete(DateTime = seq(min(DateTime), max(DateTime), by = "1 hour")) %>%
   select(names(df)) 

几乎。这个解决方案也没有“完成”值列。 - sebdalgarno
@sebdalgarno 在你的例子中,“Value”列对于每个“ID”都是相同的,是这样吗?因此,我使用了fill - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接