[英]Group rows of values above and below specific threshold in R
我有一個隨時間記錄的爐溫數據框。 我想確定溫度何時開始升高(爐子打開)和溫度何時開始下降(爐子關閉)。
我想將高於和低於設定值的溫度分組,並在組中找到最小值/最大值以確定爐子何時打開/關閉。 如下方陰影 plot 所示,對陰影區域內的數據點進行分組並找到最小值/最大值將得出爐子開啟/關閉的日期和時間。
我被困在 Group 變量上。 如何僅對AboveBelow
中的數值進行分組,而不包括帶有NA
的單元格? 這些組也需要不同,因此僅計算這些組中的最小值/最大值。
示例數據:使用 rest 作為 NA,創建高於 95 和低於 70 的溫度列:
library(tidyverse)
date_seq <- seq(as.POSIXct("2020-01-05 12:00:00"),
as.POSIXct("2020-01-05 12:07:10"),
by=(10))
a <- data.frame(Date = strftime(date_seq, format="%Y-%m-%d"),
Time = strftime(date_seq, format="%H:%M:%S"),
Temp=c(65,64,65,67,72,77,85,92,97,100,101,100,98,91,86,79,71,68,67,66,65,65,65,64,65,
67,72,77,85,92,97,100,101,100,98,91,86,79,71,68,67,66,65,66))
a <- a %>% mutate(AboveBelow= ifelse(Temp>95 | Temp<70, Temp, NA))
樣本結果:
Date Time Temp AboveBelow Group OnOff
1 2020-01-05 12:00:00 65 65 1
2 2020-01-05 12:00:10 64 64 1 On
3 2020-01-05 12:00:20 65 65 1
4 2020-01-05 12:00:30 67 67 1
5 2020-01-05 12:00:40 72 NA NA
6 2020-01-05 12:00:50 77 NA NA
7 2020-01-05 12:01:00 85 NA NA
8 2020-01-05 12:01:10 92 NA NA
9 2020-01-05 12:01:20 97 97 2
10 2020-01-05 12:01:30 100 100 2
11 2020-01-05 12:01:40 101 101 2 Off
12 2020-01-05 12:01:50 100 100 2
13 2020-01-05 12:02:00 98 98 2
14 2020-01-05 12:02:10 91 NA NA
15 2020-01-05 12:02:20 86 NA NA
16 2020-01-05 12:02:30 79 NA NA
17 2020-01-05 12:02:40 71 NA NA
18 2020-01-05 12:02:50 68 68 3
19 2020-01-05 12:03:00 67 67 3
20 2020-01-05 12:03:10 66 66 3
21 2020-01-05 12:03:20 65 65 3
22 2020-01-05 12:03:30 65 65 3
23 2020-01-05 12:03:40 65 65 3
24 2020-01-05 12:03:50 64 64 3 On
25 2020-01-05 12:04:00 65 65 3
26 2020-01-05 12:04:10 67 67 3
27 2020-01-05 12:04:20 72 NA NA
28 2020-01-05 12:04:30 77 NA NA
29 2020-01-05 12:04:40 85 NA NA
30 2020-01-05 12:04:50 92 NA NA
31 2020-01-05 12:05:00 97 97 4
32 2020-01-05 12:05:10 100 100 4
33 2020-01-05 12:05:20 101 101 4 Off
34 2020-01-05 12:05:30 100 100 4
35 2020-01-05 12:05:40 98 98 4
36 2020-01-05 12:05:50 91 NA NA
37 2020-01-05 12:06:00 86 NA NA
38 2020-01-05 12:06:10 79 NA NA
39 2020-01-05 12:06:20 71 NA NA
40 2020-01-05 12:06:30 68 68 5
41 2020-01-05 12:06:40 67 67 5
42 2020-01-05 12:06:50 66 66 5
43 2020-01-05 12:07:00 65 65 5 On
44 2020-01-05 12:07:10 66 66 5
這可以在沒有 group by 的情況下提供幫助,因為您可以以矢量化方式評估條件:
a %>%
mutate(OnOff = ifelse(is.na(AboveBelow),"",
ifelse(AboveBelow < 70 & Temp == min(Temp),"On",
ifelse(AboveBelow >95 & Temp == max(Temp),"Off",""))))
結果將是:
Date Time Temp AboveBelow OnOff
1 2020-01-05 12:00:00 65 65
2 2020-01-05 12:00:10 64 64 On
3 2020-01-05 12:00:20 65 65
4 2020-01-05 12:00:30 67 67
5 2020-01-05 12:00:40 72 NA
6 2020-01-05 12:00:50 77 NA
7 2020-01-05 12:01:00 85 NA
8 2020-01-05 12:01:10 92 NA
9 2020-01-05 12:01:20 97 97
10 2020-01-05 12:01:30 100 100
11 2020-01-05 12:01:40 101 101 Off
12 2020-01-05 12:01:50 100 100
13 2020-01-05 12:02:00 98 98
14 2020-01-05 12:02:10 91 NA
15 2020-01-05 12:02:20 86 NA
16 2020-01-05 12:02:30 79 NA
17 2020-01-05 12:02:40 71 NA
18 2020-01-05 12:02:50 68 68
19 2020-01-05 12:03:00 67 67
20 2020-01-05 12:03:10 66 66
21 2020-01-05 12:03:20 65 65
22 2020-01-05 12:03:30 65 65
23 2020-01-05 12:03:40 65 65
24 2020-01-05 12:03:50 64 64 On
25 2020-01-05 12:04:00 65 65
26 2020-01-05 12:04:10 67 67
27 2020-01-05 12:04:20 72 NA
28 2020-01-05 12:04:30 77 NA
29 2020-01-05 12:04:40 85 NA
30 2020-01-05 12:04:50 92 NA
31 2020-01-05 12:05:00 97 97
32 2020-01-05 12:05:10 100 100
33 2020-01-05 12:05:20 101 101 Off
34 2020-01-05 12:05:30 100 100
35 2020-01-05 12:05:40 98 98
36 2020-01-05 12:05:50 91 NA
37 2020-01-05 12:06:00 86 NA
38 2020-01-05 12:06:10 79 NA
39 2020-01-05 12:06:20 71 NA
40 2020-01-05 12:06:30 68 68
41 2020-01-05 12:06:40 67 67
42 2020-01-05 12:06:50 66 66
43 2020-01-05 12:07:00 65 65
44 2020-01-05 12:07:10 66 66
這樣你就得到了切割點(開和關)。 問候!
您可以使用case_when
創建Group
並在rle
創建OnOff
列的幫助下。
library(dplyr)
a %>%
group_by(Group = with(rle(!is.na(AboveBelow)), rep(cumsum(values), lengths))) %>%
mutate(OnOff = case_when(AboveBelow < 70 & Temp == min(Temp) ~ 'On',
AboveBelow > 95 & Temp == max(Temp) ~ 'Off',
TRUE ~ ''),
Group = replace(Group, is.na(AboveBelow), NA))
返回:
# Date Time Temp AboveBelow Group OnOff
#1 2020-01-05 12:00:00 65 65 1
#2 2020-01-05 12:00:10 64 64 1 On
#3 2020-01-05 12:00:20 65 65 1
#4 2020-01-05 12:00:30 67 67 1
#5 2020-01-05 12:00:40 72 NA NA
#6 2020-01-05 12:00:50 77 NA NA
#7 2020-01-05 12:01:00 85 NA NA
#8 2020-01-05 12:01:10 92 NA NA
#9 2020-01-05 12:01:20 97 97 2
#10 2020-01-05 12:01:30 100 100 2
#11 2020-01-05 12:01:40 101 101 2 Off
#12 2020-01-05 12:01:50 100 100 2
#13 2020-01-05 12:02:00 98 98 2
#14 2020-01-05 12:02:10 91 NA NA
#15 2020-01-05 12:02:20 86 NA NA
#16 2020-01-05 12:02:30 79 NA NA
#17 2020-01-05 12:02:40 71 NA NA
#18 2020-01-05 12:02:50 68 68 3
#19 2020-01-05 12:03:00 67 67 3
#20 2020-01-05 12:03:10 66 66 3
#21 2020-01-05 12:03:20 65 65 3
#22 2020-01-05 12:03:30 65 65 3
#23 2020-01-05 12:03:40 65 65 3
#24 2020-01-05 12:03:50 64 64 3 On
#25 2020-01-05 12:04:00 65 65 3
#26 2020-01-05 12:04:10 67 67 3
#27 2020-01-05 12:04:20 72 NA NA
#28 2020-01-05 12:04:30 77 NA NA
#29 2020-01-05 12:04:40 85 NA NA
#30 2020-01-05 12:04:50 92 NA NA
#31 2020-01-05 12:05:00 97 97 4
#32 2020-01-05 12:05:10 100 100 4
#33 2020-01-05 12:05:20 101 101 4 Off
#34 2020-01-05 12:05:30 100 100 4
#35 2020-01-05 12:05:40 98 98 4
#36 2020-01-05 12:05:50 91 NA NA
#37 2020-01-05 12:06:00 86 NA NA
#38 2020-01-05 12:06:10 79 NA NA
#39 2020-01-05 12:06:20 71 NA NA
#40 2020-01-05 12:06:30 68 68 5
#41 2020-01-05 12:06:40 67 67 5
#42 2020-01-05 12:06:50 66 66 5
#43 2020-01-05 12:07:00 65 65 5 On
#44 2020-01-05 12:07:10 66 66 5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.