R语言多变量同步尖锐突变检测及行标记实现方法
R多变量同步突变行标记实现方案
测试数据集定义
按照需求构建5条观测、8个数值变量的data.frame结构数据集,模拟示例中最后一行多变量大幅增长的场景:
dt <- data.frame( x1 = c(1.2, 1.5, 1.3, 1.4, 4.2), x2 = c(0.8, 0.9, 1.1, 1.0, 3.7), x3 = c(2.1, 2.2, 2.0, 2.3, 2.4), x4 = c(0.5, 0.6, 0.7, 0.5, 3.1), x5 = c(1.0, 1.1, 1.0, 1.2, 1.3), x6 = c(0.3, 0.4, 0.3, 0.4, 0.5), x7 = c(1.1, 1.2, 1.1, 1.3, 12.5), x8 = c(0.2, 0.3, 0.2, 0.3, 11.4) )
方案1:通用突变判定(统计多变量同步突变数量)
核心逻辑基于相邻行差值计算判定:
- 逐行计算与上一行的列差值
delta,首行无前置对比,差值统一补0 - 设定单变量突变阈值,逐行统计x1-x8中满足突变条件的变量总数
- 当单行列突变变量数≥2时,对应行设置
flag=1,其余行flag=0
# 计算相邻行差值矩阵 delta <- rbind(rep(0, ncol(dt)), diff(as.matrix(dt))) colnames(delta) <- paste0(colnames(dt), "_delta") dt <- cbind(dt, delta) # 单变量突变阈值(匹配mm测量单位,可按需调整) single_mutate_thresh <- 2 # 逐行统计突变变量计数 dt$mutate_count <- rowSums(abs(dt[, paste0("x",1:8, "_delta")]) >= single_mutate_thresh) # 生成标记列 dt$flag <- ifelse(dt$mutate_count >= 2, 1, 0)
在上述测试集中,最后一行的x1、x2、x4、x7、x8的差值绝对值均超过2mm阈值,突变计数为5,会被正确标记为flag=1,匹配示例场景。
方案2:定制化规则判定(匹配业务精准阈值)
严格按照提出的定制规则实现判定:x1-x4范围内至少2个变量增幅达2mm,同时x7-x8范围内变量增幅达10mm时,对应行标记flag=1
# 计算相邻行差值矩阵 delta <- rbind(rep(0, ncol(dt)), diff(as.matrix(dt))) # 规则1:x1-x4区间内增幅≥2mm的变量数≥2 cond1 <- rowSums(delta[, paste0("x",1:4)] >= 2) >= 2 # 规则2:x7-x8区间内增幅≥10mm的变量数≥1 cond2 <- rowSums(delta[, paste0("x",7:8)] >= 10) >= 1 # 两个规则同时满足时生成标记 dt$flag <- as.numeric(cond1 & cond2)
在上述测试集中,最后一行x1-x4区间内x1、x2、x4的增幅均超过2mm(满足规则1),x7、x8的增幅均超过10mm(满足规则2),最终该行被标记为flag=1。
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

