我正在比较一些分类器。我的程序是用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
答案 0 :(得分:3)
您应该只需将classifiers$teacher
和classifiers$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