我可以在 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)))
我有这个数据框,里面有 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)))