Tenho dados sobre a intensidade da água que foram coletados a cada hora ao longo de muitos meses (abaixo está um subconjunto de dados). Preciso da primeira data em que a intensidade foi maior que 900, mas somente se ela foi maior ou igual a 900 por pelo menos 24 horas. Além disso, preciso da data em que a água caiu abaixo de 900 após o último dia em que a água ficou acima de 900 por pelo menos 24 horas. Então preciso repetir isso para todos os períodos subsequentes de 24+ horas em que a intensidade da água ficar acima/abaixo de 900 novamente durante o período de estudo. Espero evitar ter que analisar todos os dados manualmente para cada local.
## 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)
Então eu deveria terminar com:
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
Extraia as linhas com intensidade maior que 900 e então crie uma variável de agrupamento
g
usandoseqid
que fornece um id exclusivo para cada sequência consecutiva. Reduza cada grupo para uma única linha com as datas da primeira e última linha adicionando uma hora à última. Extraia as linhas que representam pelo menos 24 linhas originais. Converta isso para o formato longo para questart
estop
estejam em linhas diferentes e então selecione as colunas desejadas.dando
Podemos usar
rollapply
fromzoo
para encontrar períodos de 24 horas em que a intensidade excedeu um certo valor e, em seguida,seqid
fromcollapse
para agrupar esses períodos e selecionar a primeira data de cada período.