0

我想从一个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)
}
4

0 回答 0