在 R 中对高于和低于特定阈值的值行进行分组

问题描述

我有一个随时间记录的炉温数据框。我想确定温度何时开始升高(炉子打开)和温度何时开始下降(炉子关闭)。

我想将高于和低于设定数字的温度分组,并找到组中的最小值/最大值以确定炉子何时打开/关闭。如下面的阴影图所示,将阴影区域内的数据点分组并找到最小值/最大值将得出炉子打开/关闭的日期和时间。

我被困在 Group 变量上。如何仅对 //set a variable for the color inside you stateful widget Color containerColor = Colors.white; //then in your onTap function onTap: (){ setState(() { color = Colors.red; }); } 中的数值进行分组而不包含带有 AboveBelow 的单元格?组也需要不同,因此只计算这些组内的最小值/最大值。

示例数据: 创建一个高于 95 和低于 70 的温度列,其余为 NA:

NA

Grouping data points within the shaded regions,and finding the min/max will yield the date and time when the furnace turns on/off

示例结果:

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,98,91,86,79,71,68,66,66))

a <- a %>% mutate(AboveBelow= ifelse(Temp>95 | Temp<70,Temp,NA))

解决方法

这可以在没有分组的情况下有所帮助,因为您可以以矢量化的方式评估条件:

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 

这样你就可以得到切入点(开和关)。问候!

,

您可以使用 rle 创建 Group 并借助 case_when 创建 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      

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...