我正在尝试检查聚类算法的准确率,其数据框与此处的数据框类似。 orig.gp
引用原始分组,即“正确”的分组。 new.gp
指的是由聚类算法分配的分组。
df <- data.frame(id = 1:9,
orig.gp = c(rep(1:3, each = 3)),
new.gp = c(2, 2, 3, 3, 3, 1, 1, 1, 1) )
df
# id orig.gp new.gp
# 1 1 1 2
# 2 2 1 2
# 3 3 1 3
# 4 4 2 3
# 5 5 2 3
# 6 6 2 1
# 7 7 3 1
# 8 8 3 1
# 9 9 3 1
我要确定的是,是否为orig.gp
分配了相同的ID。组号本身并不重要,因为数字是任意的。理想情况下,我想实现这样的目标:
# orig.gp new.gp correct
# 1 1 2 yes
# 2 1 2 yes
# 3 1 3 no
# 4 2 3 yes
# 5 2 3 yes
# 6 2 1 no
# 7 3 1 yes
# 8 3 1 yes
# 9 3 1 yes
为了说明,在原始分组中,组1由id 1,2,3组成;第2组由4,5,6组成;第3组由7,8,9组成。在新分组中,ID 1,2正确分配到同一组中,因此正确列中的“是”。我想确定是否将相同的ID分配到与原始分组相同的组中。
任何建议都将不胜感激!
答案 0 :(得分:2)
我理解你的问题的方式,基本上是重新编码。也就是说,您想要识别落在new.gp
和orig.gp
交叉制表的对角线上的观察结果,但new.gp
的值被贴错标签。
我在此提出的建议基本上是根据简单的交叉制表重新编码new.gp
的值(参见下面的tab
)。通过对orig.gp
的每个可能值取new.gp
的模态值并假设此模式是正确的值标签来完成重新编码。然后我使用 car 中的recode
来执行重新编码。
library("car")
tab <- with(df, table(new.gp, orig.gp))
tab
## orig.gp
## new.gp 1 2 3
## 1 0 1 3
## 2 2 0 0
## 3 1 2 0
df$recoded <- recode(df$new.gp, paste(rownames(tab),colnames(tab)[max.col(tab)],sep='=',collapse=';'))
df$correct <- ifelse(df$orig.gp == df$recoded, "yes", "no")
结果:
> df
orig.gp new.gp recoded correct
1 1 2 1 yes
2 1 2 1 yes
3 1 3 2 no
4 2 3 2 yes
5 2 3 2 yes
6 2 1 3 no
7 3 1 3 yes
8 3 1 3 yes
9 3 1 3 yes