循环前3次迭代运行正常,第3次后触发dimnames长度不匹配报错
R语言qcc包循环计算Cpk中途报错解决方案
报错信息:
Error in dimnames(x) <- dn :
length of 'dimnames' [1] not equal to array extent
Calls: ... withCallingHandlers -> withVisible -> eval -> eval -> qcc -> rownames<-
核心问题原因
这个报错是qcc()函数在给计算结果矩阵赋值行名时,传入的行名长度和矩阵实际行数不匹配触发的。你排查未发现的差异大概率是隐性的分组规则/空值问题,不是显式的数值字段差异。
排查步骤
- 单独提取第3个(正常运行)和第4个(报错)零件的输入数据,运行以下代码验证维度匹配性:
# 替换为你的零件编号、数据集名、分组列名(批次/采样时间等) test_part_list <- c("第3个零件编号", "第4个零件编号") for (p in test_part_list) { temp_df <- 原始数据集[原始数据集$零件编号 == p, ] cat("=====零件", p, "维度信息=====\n") cat("数据总行数:", nrow(temp_df), "\n") cat("分组唯一值数量:", length(unique(temp_df$分组列名)), "\n") cat("每组平均样本量:", nrow(temp_df)/length(unique(temp_df$分组列名)), "\n\n") }
90%以上的同类问题都会在这一步发现差异,常见的两种异常情况为:
- 第4个及之后的零件存在只有1个样本的分组,qcc默认要求每组至少2个样本计算组内方差,计算时会自动过滤/合并不符合要求的分组,导致最终矩阵行数和原始行名长度不匹配
- 你循环内给qcc传入的行名是固定长度的全局变量,比如前3个零件都是12个批次就写死了12个行名,后续零件批次数量不等于12就会触发报错
修复方案
单样本分组适配
如果确实存在单样本分组,给qcc函数指定适配单样本的参数即可:
qcc_obj <- qcc(数据矩阵, type = "xbar.one", nsigmas = 3, # 其余你原来的参数)
动态行名赋值
不要写死行名长度,改为从当前零件数据动态提取:
# 错误写法:写死行名长度 rownames(data_matrix) <- c("批次1","批次2",..."批次12") # 正确写法:动态适配当前零件的分组数量 rownames(data_matrix) <- as.character(unique(temp_df$分组列名))
循环容错优化
在循环开头增加校验逻辑,避免运行中途中断:
part_list <- unique(原始数据集$零件编号) for (part in part_list) { temp_df <- 原始数据集[原始数据集$零件编号 == part, ] group_n <- length(unique(temp_df$分组列名)) sample_per_group <- nrow(temp_df)/group_n # 不符合计算要求的零件直接跳过并打印提示 if (sample_per_group < 2 & !"xbar.one" %in% 你指定的qcc类型) { message(paste("零件", part, "存在单样本分组,跳过计算")) next } # 后续放你原来的绘图、Cpk计算、汇总表输出逻辑 }
内容的提问来源于stack exchange,提问作者Hamdi Demirci
相关产品推荐
相关产品推荐

