为设备运行事件序列分配标识符,过滤错误观测并标记循环
设备运行记录仪数据处理
样本数据
df1 <- read.table(text = "temp.1 heating heating heating heating heating heating heating heating cooling heating heating heating heating heating heating cooling cooling cooling cooling cooling cooling cooling heating heating heating cooling cooling heating heating heating cooling heating heating heating heating cooling cooling cooling cooling heating heating heating cooling heating cooling heating cooling heating heating heating heating", header = TRUE)
需求说明
- 加热(heating)过程中偶尔出现1-2次冷却(cooling)观测,冷却过程中偶尔出现1次加热观测,这些均为错误观测,需忽略。
- 修正后需为加热/冷却运行循环标记带连续序号的类别,用于统计单日循环次数。
- 状态切换规则:连续出现3次不同状态时,才切换循环类别。
预期结果示例
> df1 temp.1 level 1 heating H.1 2 heating H.1 3 heating H.1 4 heating H.1 5 heating H.1 6 heating H.1 7 heating H.1 8 heating H.1 9 cooling H.1 10 heating H.1 11 heating H.1 12 heating H.1 13 heating H.1 14 heating H.1 15 heating H.1 16 cooling C.1 17 cooling C.1 18 cooling C.1 19 cooling C.1 20 cooling C.1 21 cooling C.1 22 cooling C.1 23 heating H.2 24 heating H.2 25 heating H.2 26 cooling H.2 27 cooling H.2 28 heating H.2 29 heating H.2 30 heating H.2 31 cooling H.2 32 heating H.2 33 heating H.2 34 heating H.2 35 heating H.2 36 cooling C.2 37 cooling C.2 38 cooling C.2 39 cooling C.2 40 heating H.3 41 heating H.3 42 heating H.3 43 cooling H.3 44 heating H.3 45 cooling H.3 46 heating H.3 47 cooling H.3 48 heating H.3 49 heating H.3 50 heating H.3 51 heating H.3
补充场景示例(冷却序列被单次加热观测中断时,该加热观测需忽略)
df1 temp.1 level 1: heating H.1 2: heating H.1 3: heating H.1 4: heating H.1 5: heating H.1 6: heating H.1 7: heating H.1 8: heating H.1 9: cooling H.1 10: heating H.1 11: heating H.1 12: heating H.1 13: heating H.1 14: heating H.1 15: heating H.1 16: cooling C.1 17: cooling C.1 18: cooling C.1 19: cooling C.1 20: cooling C.1 21: cooling C.1 22: cooling C.1 23: heating H.2 24: heating H.2 25: heating H.2 26: cooling H.2 27: cooling H.2 28: heating H.2 29: heating H.2 30: heating H.2 31: cooling H.2 32: heating H.2 33: heating H.2 34: heating H.2 35: heating H.2 36: cooling C.2 37: cooling C.2 38: cooling C.2 39: cooling C.2 40: heating H.3 41: heating H.3 42: heating H.3 43: cooling H.3 44: heating H.3 45: cooling H.3 46: heating H.3 47: cooling C.3 48: cooling C.3 49: cooling C.3 50: cooling C.3 51: cooling C.3 52: heating C.3 53: cooling C.3 54: cooling C.3 55: cooling C.3 56: heating H.4 57: heating H.4 58: heating H.4
R语言实现方案
library(dplyr) library(zoo) # 生成滑动窗口,识别连续3次相同状态的点位 df1 <- df1 %>% mutate( window_3 = rollapply(temp.1, width = 3, FUN = function(x) length(unique(x)) == 1, align = "left", fill = NA) ) # 初始化基准状态与循环序号 current_state <- df1$temp.1[1] cycle_num <- 1 df1$level <- paste0(substr(current_state, 1, 1), ".", cycle_num) # 遍历数据更新循环标记 for (i in 2:nrow(df1)) { # 检测到连续3次不同状态时,切换循环 if (!is.na(df1$window_3[i-2]) && df1$window_3[i-2] && df1$temp.1[i-2] != current_state) { current_state <- df1$temp.1[i-2] cycle_num <- cycle_num + 1 df1$level[i:nrow(df1)] <- paste0(substr(current_state, 1, 1), ".", cycle_num) } } # 移除辅助列 df1 <- df1 %>% select(-window_3) # 输出结果 print(df1)
代码说明
- 用
rollapply创建长度为3的滑动窗口,判断窗口内是否为连续相同状态,这是触发循环切换的核心依据。 - 从初始状态开始遍历数据,一旦检测到连续3次不同状态,就更新基准状态并递增循环序号,同步更新后续所有行的循环标记。
- 最后移除辅助计算列,得到符合需求的标记结果。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

