匹配列之间的组分配

时间:2014-11-16 20:55:39

标签: r

我正在尝试检查聚类算法的准确率,其数据框与此处的数据框类似。 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分配到与原始分组相同的组中。

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:2)

我理解你的问题的方式,基本上是重新编码。也就是说,您想要识别落在new.gporig.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