我想从一个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
我可以快速轻松地创建一个混淆矩阵,显示co1
和co2
如何同意和不同意(真与假)....
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)
}