R语言如何基于QC表自动过滤多列指定时间范围的故障数据
水槽数据自动化QC处理方案
前置数据预处理
首先统一处理时间格式,避免时间比较出错:
library(tidyverse) library(lubridate) # 转换QC表的时间格式 QC_table <- QC_table %>% mutate( date_time_start = ymd_hm(date_time_start), date_time_end = ymd_hm(date_time_end) ) # 转换原数据的时间格式 df <- dataframe %>% mutate(Measurement.time = ymd_hm(Measurement.time))
自动化QC核心逻辑
采用宽表转长表关联QC规则,再转回宽表的思路,无需手动遍历每个水槽/时间段,自动适配所有QC规则:
df_qc <- df %>% # 宽表转长表,把所有水槽指标列拆成行 pivot_longer( cols = -c(Measurement.time, Trial), names_to = "col_full_name", values_to = "value" ) %>% # 提取列名前缀,和QC表的data_type_tank匹配(去掉末尾的_Avg/_Std后缀) mutate( data_type_tank = str_remove(col_full_name, "(_Avg|_Std)$") ) %>% # 关联QC表的规则 left_join( QC_table %>% select(trial, data_type_tank, date_time_start, date_time_end), by = c("Trial" = "trial", "data_type_tank") ) %>% # 符合故障时间范围的数值替换为NA mutate( value = if_else( Measurement.time >= date_time_start & Measurement.time <= date_time_end, NA_character_, value ) ) %>% # 清理不需要的列,转回宽表 select(Measurement.time, Trial, col_full_name, value) %>% pivot_wider( names_from = col_full_name, values_from = value )
方案优势
- 全自动化:不管QC表新增多少条故障规则、多少个水槽/数据类型,代码无需修改,直接运行即可
- 效率更高:基于向量化运算,比手动循环/逐行subset效率高很多,适合大体积时序数据
- 完全符合预期输出:仅将故障时间段的对应指标列置为NA,保留所有时间行和其他水槽的有效数据,和你给出的示例输出结构完全一致
内容的提问来源于stack exchange,提问作者timvdstap
相关产品推荐
相关产品推荐

