由数据框中的列定义的时间段的开始和结束日期
Start and end dates of time periods defined by a column in a data frame
我有一个按行组织的每小时数据数据库,我想重塑它,以便在数据符合特定条件时获取开始和结束时间
考虑以下案例,一列是连续的每小时时间,第二列是虚拟变量数据。
Yrs= data.frame(Date=seq(as.POSIXct("2019-02-04 01:00:00",tz="UTC"), as.POSIXct("2019-02-04 23:00:00",tz="UTC"), by="hour"))
Yrs$Var=c(1:12,1:11)
我想获取变量介于 3 和 7 之间的时间段的开始和结束日期。
预期结果:
StartDate EndDate
2019-02-04 03:00:00 2019-02-04 07:00:00
2019-02-04 15:00:00 2019-02-04 19:00:00
我想我可以创建一个新列来指示满足条件的行,但不知道如何获取这些连续期间的开始和结束
Yrs$Period= ifelse(Yrs$Var >= 3 & Yrs$Var <=7, 1, 0)
我在这里找到了这个问题的反例
但我正在努力解决这个问题。任何帮助将不胜感激。
可能是这样的:
library(data.table)
setDT(Yrs)[, .(StartDate=Date[Var==3L], EndDate=Date[Var==7L]),
by=.(c(0L, cumsum(diff(Var) < 1L)))][, -1L]
输出:
StartDate EndDate
1: 2019-02-04 03:00:00 2019-02-04 07:00:00
2: 2019-02-04 15:00:00 2019-02-04 19:00:00
为什么不 filter
和 spread
?
library(dplyr)
Yrs %>%
filter(Var == 3 | Var == 7) %>%
group_by(Var) %>%
mutate(ind = row_number()) %>%
spread(Var, Date) %>%
select(-ind) %>%
rename_all(funs(c("Start_Date", "End_Date")))
# Start_Date End_Date
# <dttm> <dttm>
#1 2019-02-04 03:00:00 2019-02-04 07:00:00
#2 2019-02-04 15:00:00 2019-02-04 19:00:00
我有一个按行组织的每小时数据数据库,我想重塑它,以便在数据符合特定条件时获取开始和结束时间
考虑以下案例,一列是连续的每小时时间,第二列是虚拟变量数据。
Yrs= data.frame(Date=seq(as.POSIXct("2019-02-04 01:00:00",tz="UTC"), as.POSIXct("2019-02-04 23:00:00",tz="UTC"), by="hour"))
Yrs$Var=c(1:12,1:11)
我想获取变量介于 3 和 7 之间的时间段的开始和结束日期。
预期结果:
StartDate EndDate
2019-02-04 03:00:00 2019-02-04 07:00:00
2019-02-04 15:00:00 2019-02-04 19:00:00
我想我可以创建一个新列来指示满足条件的行,但不知道如何获取这些连续期间的开始和结束
Yrs$Period= ifelse(Yrs$Var >= 3 & Yrs$Var <=7, 1, 0)
我在这里找到了这个问题的反例
可能是这样的:
library(data.table)
setDT(Yrs)[, .(StartDate=Date[Var==3L], EndDate=Date[Var==7L]),
by=.(c(0L, cumsum(diff(Var) < 1L)))][, -1L]
输出:
StartDate EndDate
1: 2019-02-04 03:00:00 2019-02-04 07:00:00
2: 2019-02-04 15:00:00 2019-02-04 19:00:00
为什么不 filter
和 spread
?
library(dplyr)
Yrs %>%
filter(Var == 3 | Var == 7) %>%
group_by(Var) %>%
mutate(ind = row_number()) %>%
spread(Var, Date) %>%
select(-ind) %>%
rename_all(funs(c("Start_Date", "End_Date")))
# Start_Date End_Date
# <dttm> <dttm>
#1 2019-02-04 03:00:00 2019-02-04 07:00:00
#2 2019-02-04 15:00:00 2019-02-04 19:00:00