You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R代码警告:替换项数量与替换长度不匹配的修复方案

问题修复:One vs Rest多分类混淆矩阵计算的R代码警告

问题描述

运行基于鸢尾花数据集的One vs Rest多分类混淆矩阵计算代码时,出现警告:

Warning: number of items to replace is not a multiple of replacement length

问题定位到这行代码:

binaryConMat[binaryConMat != 0] <- ifelse(rownames(binaryConMat) == current, 1, 0)

原因分析

  • binaryConMat[binaryConMat != 0]提取了矩阵中所有非零元素的位置,原矩阵共有5个非零元素。
  • ifelse(rownames(binaryConMat) == current, 1, 0)生成的是长度为3的向量(对应3个类别行名)。
  • 替换时,长度3的向量无法匹配长度5的非零元素集合,导致长度不匹配警告。

修复方法

不需要仅替换非零元素,直接对整个矩阵按行进行二进制标记,保留矩阵结构即可。修改问题代码行为:

binaryConMat[] <- ifelse(rownames(binaryConMat) == current, 1, 0)

完整修复后代码

mtrx <- matrix(c(10,0,0,0,10,1,0,0,9), ncol = 3)
rownames(mtrx) <- c("setosa","versicolor", "virginica") # 修正原代码拼写错误:veriscolor → versicolor
colnames(mtrx) <- c("setosa", "versicolor", "virginica")
cat <- colnames(mtrx)

for(n in 1:length(cat)) {
  current <- cat[n]
  binaryConMat <- mtrx
  # 修复后的代码行
  binaryConMat[] <- ifelse(rownames(binaryConMat) == current, 1, 0)
  
  print(binaryConMat)
  
  TP <- mtrx[n, n] # 直接从原矩阵取真实值,更准确
  FN <- sum(mtrx[n,]) - TP
  FP <- sum(mtrx[,n]) - TP
  TN <- sum(mtrx) - TP - FN - FP # 修正TN计算逻辑:用总样本数减去其他三项
  
  sensitivity <- ifelse((TP + FN) == 0, 0, TP / (TP + FN))
  specificity <- ifelse((TN + FP) == 0, 0, TN / (TN+FP))
  precision <- ifelse((TP + FP) == 0, 0, TP / (TP + FP))
  
  cat("Class:", current, "\n")
  cat("Sensitivity:", round(sensitivity, 2), "\n")
  cat("Specificity:", round(specificity, 2), "\n")
  cat("Precision:", round(precision, 2), "\n")
  cat("\n")
}

accuracy <- sum(diag(mtrx))/sum(mtrx)
cat("Overall Accuracy:",round(accuracy, 2), "\n")

额外修正说明

  1. 原代码中rownames(mtrx)拼写错误:veriscolor改为versicolor,与列名保持一致。
  2. 原代码中TN计算逻辑错误:原sum(diag(binaryConMat)) - TP不符合二分类TN的定义,正确应为总样本数减去TP、FN、FP之和。
  3. TP直接从原混淆矩阵提取更准确,无需依赖二进制矩阵。

内容的提问来源于stack exchange,提问作者JTruant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:45:33