我可以在 R 中填满时间吗?

Can I fill time in R?

我有这个数据框,里面有 date_time。原始数据框更大,我无法检查所有观察结果以确保它具有正确的时间顺序。

dataframe<- structure(list(Date_Time = structure(1:5, .Label = c("2015-04-01 00:00:00", 
"2015-04-01 00:05:00", "2015-04-01 00:15:00", "2015-04-01 00:25:00", 
"2015-04-01 00:40:00"), class = "factor"), Speed = c(50L, 60L, 
70L, 65L, 40L)), class = "data.frame", row.names = c(NA, -5L))

结果应该如下所示:

result <- structure(list(Date_Time = structure(1:9, .Label = c("2015-04-01 00:00:00", 
"2015-04-01 00:05:00", "2015-04-01 00:10:00", "2015-04-01 00:15:00", 
"2015-04-01 00:20:00", "2015-04-01 00:25:00", "2015-04-01 00:30:00", 
"2015-04-01 00:35:00", "2015-04-01 00:40:00"), class = "factor"), 
    Speed = c(50L, 60L, NA, 70L, NA, 65L, NA, NA, 40L)), class = "data.frame", row.names = c(NA, 
-9L))

这对我来说很重要,因为我想将速度领先 5 分钟,而在第一种情况下情况并非如此。

一个选项是创建一个包含 date/time 个间隔 5 分钟的序列的数据框,然后与原始数据合并。

dataframe$Date_Time <- as.POSIXct(as.character(dataframe$Date_Time))
str(dataframe)

date5 <- data.frame(Date_Time=seq.POSIXt(min(dataframe$Date_Time),
                                         max(dataframe$Date_Time), by="5 mins"))

newdataframe <- merge(dataframe, date5, all=TRUE)
newdataframe

            Date_Time Speed
1 2015-04-01 00:00:00    50
2 2015-04-01 00:05:00    60
3 2015-04-01 00:10:00    NA
4 2015-04-01 00:15:00    70
5 2015-04-01 00:20:00    NA
6 2015-04-01 00:25:00    65
7 2015-04-01 00:30:00    NA
8 2015-04-01 00:35:00    NA
9 2015-04-01 00:40:00    40

一个管道中的 tidyverse 选项

library(tidyverse)
library(lubridate)

data.frame(Date_Time = seq(from = min(ymd_hms(dataframe$Date_Time)), 
                           to = max(ymd_hms(dataframe$Date_Time)), 
                           by = "5 min")) %>% 
    left_join(., dataframe %>% mutate(Date_Time = ymd_hms(Date_Time)))