簡體   English   中英

在 R 中對高於和低於特定閾值的值進行分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM