我有一个按行组织的每小时数据的数据库,并希望以某种方式重塑它,以便在数据符合特定条件时获得开始和结束时间
考虑以下示例,一列是连续的每小时时间,第二列是虚拟变量数据。
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)
我在Given start date and end date, reshape/expand data for each day between (each day on a row)处找到了与此问题相反的例子 但我正在努力解决这个问题。任何帮助将不胜感激。
答案 0 :(得分: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
答案 1 :(得分:0)
为什么不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