问题描述
df <- data.frame(
nestID = c(rep("LB1_2014",9),rep("LB2_2014",2)),Datetime = seq(from = ymd_hms("2014-04-02 05:00:00"),to = ymd_hms("2014-04-02 15:00:00"),by = "1 hour"),Temp = c(29.083,29.200,28.536,28.221,27.934,28.417,28.942,29.323,29.42,28.93,28.28),Flooded = c(rep(FALSE,2),TRUE,rep(FALSE,8)))
> df
nestID Datetime Temp Flooded
1 LB1_2014 2014-04-02 05:00:00 29.083 FALSE
2 LB1_2014 2014-04-02 06:00:00 29.200 FALSE
3 LB1_2014 2014-04-02 07:00:00 28.536 TRUE
4 LB1_2014 2014-04-02 08:00:00 28.221 FALSE
5 LB1_2014 2014-04-02 09:00:00 27.934 FALSE
6 LB1_2014 2014-04-02 10:00:00 28.417 FALSE
7 LB1_2014 2014-04-02 11:00:00 28.942 FALSE
8 LB1_2014 2014-04-02 12:00:00 29.323 FALSE
9 LB1_2014 2014-04-02 13:00:00 29.420 FALSE
10 LB2_2014 2014-04-02 14:00:00 28.930 FALSE
11 LB2_2014 2014-04-02 15:00:00 28.280 FALSE
我想找出每个 nestID 第一次降温的幅度。
所以在 Flooded == TRUE 之后,
上一行的 Temp 是 TempBefore
然后找到在 Temp 再次上升到 TempBefore 之前达到的最小 Temp。
(Flooded == TRUE 只是承认温度下降的最小值。)
幅度 = TempBefore - MinTemp
我正在寻找的输出是每个 nestID 和 Magnitude 的一行。如果 Flooded != TRUE,则为幅度 NA。
对于这个示例数据,我想要的输出是:
TempBefore = 29.200, 最小温度 = 27.934
因此
nestID Magnitude
1 LB1_2014 1.266
2 LB2_2014 NA
(可能有多个 Flooded 事件,但为了简单起见,我只寻找第一个 Flooded == TRUE 事件的大小。)
FloodingMagnitude = group_by (df,nestID) %>%
mutate(TempBefore = if_else(Flooded == TRUE,lag(Temp,default = first(Temp)),as.double(NA))) %>%
# line of code I need to work:
mutate(MinTemp = min(Temp) before it reaches TempBefore again) %>%
mutate(Magnitude = TempBefore - MinTemp) %>%
distinct(nestID,Magnitude)
解决方法
也许这会有所帮助 -
library(dplyr)
df %>%
filter(Flooded | lead(Flooded)) %>%
group_by(NestID,Flooded = data.table::rleid(Flooded)) %>%
slice(n()) %>%
group_by(NestID) %>%
summarise(Magnitude = Temp - lead(Temp),.groups = 'drop')
# NestID Magnitude
# <chr> <dbl>
#1 LB1_2014 1.56
#2 LB1_2014 NA