r使用变量创建混淆矩阵

时间:2014-08-20 15:59:12

标签: r confusion-matrix

我想从一个dataframe创建多个混淆矩阵,其中包含一个分类变量(df$park),用于定义我希望矩阵汇总的方式。

这是我的数据:

df <- structure(list(park = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("miss", 
"piro"), class = "factor"), co1 = structure(c(1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 
2L), .Label = c("false", "true"), class = "factor"), co2 = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 
1L, 1L, 1L, 1L), .Label = c("false", "true"), class = "factor"), 
    UNIQUE = structure(c(2L, 4L, 7L, 9L, 16L, 17L, 18L, 19L, 
    20L, 21L, 1L, 3L, 5L, 6L, 8L, 10L, 11L, 12L, 13L, 14L, 15L
    ), .Label = c("10066_109_2010", "1012008_ 2008", "10269_7_2006", 
    "10332008_ 2008", "10588_51_2006", "10628_46_2008", "10642006_ 2006", 
    "10683_26_2006", "1072010_ 2010", "10749_1_2009", "10750_1_2010", 
    "10802_6_2006", "10841_43_2006", "10902_19_2006", "10921_37_2006", 
    "1102007_ 2007", "1102008_ 2008", "1102010_ 2010", "11142006_ 2006", 
    "1172007_ 2007", "1232010_ 2010"), class = "factor")), .Names = c("park", 
"co1", "co2", "UNIQUE"), class = "data.frame", row.names = c(NA, 
-21L))

看起来像......

> head (df)
  park   co1   co2         UNIQUE
1 miss false false  1012008_ 2008
2 miss false false 10332008_ 2008
3 miss false false 10642006_ 2006
4 miss false false  1072010_ 2010
5 miss false false  1102007_ 2007
6 miss false false  1102008_ 2008

我可以快速轻松地创建一个混淆矩阵,显示co1co2如何同意和不同意(真与假)....

conf <- table(df$co1,df$co2)
conf

    false true
  false    13    3
  true      3    2

但我想要df$park总结的真实和虚假,这将为df$park中的每个因素创建一个表格。

有什么想法吗?

由于 -al

编辑1: @ won782是正确的,这段代码有效....

conf <- table (df[,3:1])

> conf
, , park = miss

       co1
co2     false true
  false     8    0
  true      0    2

, , park = piro

       co1
co2     false true
  false     5    3
  true      3    0

但是现在我需要保留这种格式并输出到csv文件。

编辑2:

使用as.data.frame(table (df[,3:1]))不会保留漂亮的交叉表。这就是as.data.frame产生的结果。

> conf.df <- as.data.frame(table(df[,3:1]))
> conf.df
     co2   co1 park Freq
1  false false miss   50
2   true false miss    1
3  false  true miss    3
4   true  true miss   27
5  false false piro  390
6   true false piro   64
7  false  true piro   17
8   true  true piro   81
9  false false sacn  222
10  true false sacn   14
11 false  true sacn    3
12  true  true sacn   58
13 false false slbe  340
14  true false slbe   65
15 false  true slbe   33
16  true  true slbe  18

编辑3: 我决定改为for循环。

lev <- levels (df$park)
for (p in lev){
g <- df[which(df$park==p),]
test <- table(g$co1,g$co2)
write.csv(test,(paste("c:\temp\","confuse_",p,".csv",sep='')),row.names=F)
}

编辑4: 为了捕获表输出的确切格式,我发现你可以capture并将其发送到文本文件。如果capture并将其作为csv输出会更好,但我对此的尝试产生了不太可读的csv文件。这是我捕获它并将其发送到文本文件的解决方案。

lev <- levels (df$park)
for (p in lev){
g <- df[which(df$park==p),]
test <- table(g$co1,g$co2)
out <- capture.output(test)
cat(out,file=paste("c:\temp\","confuse_",p,".txt",sep=""),sep="\n",append=TRUE)
}

0 个答案:

没有答案