问题描述
我有一个随时间记录的炉温数据框。我想确定温度何时开始升高(炉子打开)和温度何时开始下降(炉子关闭)。
我想将高于和低于设定数字的温度分组,并找到组中的最小值/最大值以确定炉子何时打开/关闭。如下面的阴影图所示,将阴影区域内的数据点分组并找到最小值/最大值将得出炉子打开/关闭的日期和时间。
我被困在 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
示例结果:
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