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