我有几个月内每小时收集的水强度数据(以下是数据子集)。我需要第一次强度大于 900 的日期,但前提是强度大于或等于 900 的时间至少为 24 小时。此外,我需要在水位高于 900 至少 24 小时的最后一天之后,水位随后降至 900 以下的日期。然后,我需要在整个研究期间,对水位强度再次高于/低于 900 的所有后续 24 小时以上时间段重复此操作。我希望避免必须手动查看每个站点的所有数据。
## creates example dataframe
NoOfHours <- as.numeric(ymd_hms("2010-01-06 01:00:00") - ymd_hms("2010-01-01 07:00:00"))*24
dt<-ymd_hms("2010-01-01 00:00:00") + hours(0:NoOfHours)
intensity<-c(rep(c(0),23),rep(c(901,904),12), rep(c(660,540),10), rep(c(905,3000),10), 550, rep(c(1000,1200),13),340)
df<-data.frame(dt, intensity)
因此我应该得到以下结论:
dt1 status
1 2010-01-01 23:00:00 start
2 2010-01-02 23:00:00 stop
3 2010-01-04 16:00:00 start
4 2010-01-05 18:00:00 stop
提取强度大于 900 的行,然后创建一个分组变量,
g
使用seqid
该变量为每个连续序列提供唯一 ID。将每个这样的组缩减为一行,第一行和最后一行的日期在最后一行上加一小时。提取代表至少 24 个原始行的行。将其转换为长格式,使和start
位于stop
不同的行,然后选择所需的列。给予
我们可以使用
rollapply
fromzoo
来查找强度超过一定量的 24 小时内的时间段,然后seqid
使用 fromcollapse
对这些时间段进行分组并选择每个时间段的第一个日期。