我需要table()的输出为正方形(如果需要,用零填充)

时间:2010-10-22 23:14:52

标签: r

我正在比较一些分类器。我的程序是用table命令计算混淆矩阵,然后从表中计算误报和真正的正率。我写的例程要求表格是正方形的。应该有一个简单的方法来做到这一点。

我的设置:

  

cm< - table(classifiers $ teacher [which(classifiers $ problem =='problem27')],

      分类器$ srAve [which(classifiers $ problem =='problem27')])   厘米

     1  2  3
  0 23  0  0
  1  2  4  0
  2  2 10  0
  3  0  1  0
  4  0  0  1
> missingNames <- as.numeric( rownames(cm)[ !(rownames(cm) %in% as.numeric(colnames(cm)))  ] )
> missingNames
[1] 0 4

然后我编写的C like函数来修复它:

padTable <- function( missingNames, cm ) {
    rowLength <- dim(cm)[1]
    for (i in missingNames) {
       zeroes <- rep(0,rowLength)
       cNames <- colnames(cm)
       after <- which ( (i < as.numeric(cNames)) )[1]
       before <- which ( (i > as.numeric(cNames)) )[1]
       if ( is.na(before) ) { #The very begining
          cm <- cbind(zeroes,cm)
          colnames(cm) <- c(i,cNames)
       } else {
          if (is.na(after)) { #The very end
              cm <- cbind(cm,zeroes)
              colnames(cm) <- c(cNames,i)
          } else { #somewhere in the middle
               print('ERROR CANNOT INSERT INTO MIDDLE YET.')
               cm = NULL
          }
       }
    } 
    return(cm)
}

因此,必须有一些非常简单的方法来完成这项工作。每当我发现自己在R中编写C代码时,我就知道我做错了。

感谢您的帮助。

编辑:按要求提供样本数据:

> classifiers$teacher[which(classifiers$problem == 'problem27')]
[1] 0 0 1 2 2 2 0 0 0 0 0 2 0 0 2 0 4 3 0 0 2 2 0 2 0 0 2 2 1 0 0 2 1 0 1 2 0 0
[39] 0 1 0 0 1
> classifiers$srAve[which(classifiers$problem == 'problem27')]
[1] 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 3 2 1 1 2 2 1 2 1 1 2 2 1 1 1 2 2 1 2 2 1 1
[39] 1 2 1 1 1

1 个答案:

答案 0 :(得分:3)

您应该只需将classifiers$teacherclassifiers$srAve转换为因素,但我只是在猜测,因为我不知道您的数据是什么样的。

> x <- factor(sample(0:4,20,TRUE))
> y <- factor(sample(1:3,20,TRUE),levels=levels(x))
> z <- data.frame(x,y)
> table(z)
   y
x   0 1 2 3 4
  0 0 1 2 0 0
  1 0 1 0 1 0
  2 0 2 2 1 0
  3 0 3 3 2 0
  4 0 0 2 0 0
> z$y <- as.character(y)
> table(z)
   y
x   1 2 3
  0 1 2 0
  1 1 0 1
  2 2 2 1
  3 3 3 2
  4 0 2 0