聚类分析——根据索引值将聚类质心与聚类中心项名称匹配

Cluster analysis - match cluster centroids to cluster center item names based on index value

我完成了聚类分析,并且能够在我的数据集中适当地标记每个 'Item' 它属于哪个聚类。

我还有一个聚类中心索引值的列表,叫做centroidList。

我正在尝试获取质心列表中的值并生成一个名为簇质心的列,该列将我的索引值与 'Item' 值相匹配,然后填充该 'Item' 值,但是我不清楚如何在 R 中进行此操作。

我尝试做一些 if/then 语句,但运气不佳。

有什么指点吗?

Items <-c("ABC","DEF","GHI","JKL","MNO","PQR","STU","VWX")
Cluster <-c(1,1,1,2,2,2,3,3)

df <- data.frame(Items,Cluster)
df

centroidList <-c(1,5,7) #These represent the index of the cluster centers

Example output

这就是您想要的...

library(dplyr)

创建映射数据框

df_cl_map <- data.frame(centroidList, Cluster = 1:4)

只需执行左连接即可将 centroidList 映射到集群。

然后创建一个新变量:Cluster Centroid 通过连接或 paste0 文本 "Item" 和 centroidList 的内容与 dplyr::mutate 函数。

df %>% 
  left_join(df_cl_map) %>% 
  mutate(`Cluster Centroid` = paste0("Item", centroidList)) %>% 
  select(-centroidList)

#> Joining, by = "Cluster"
#>     Items Cluster Cluster Centroid
#> 1   Item1       1            Item1
#> 2   Item2       1            Item1
#> 3   Item3       1            Item1
#> 4   Item4       2            Item5
#> 5   Item5       2            Item5
#> 6   Item6       2            Item5
#> 7   Item7       3            Item7
#> 8   Item8       3            Item7
#> 9   Item9       4           Item10
#> 10 Item10       4           Item10

reprex package (v0.3.0)

于 2020-05-23 创建

这是一个非常基础的 R 解决方案:

unsplit(
  lapply(split(df, Cluster), 
         function(x) cbind(x, `Cluster Centroid`=intersect(paste0("Item", centroidList), x$Items))
         ), Cluster)
#>     Items Cluster Cluster Centroid
#> 1   Item1       1            Item1
#> 2   Item2       1            Item1
#> 3   Item3       1            Item1
#> 4   Item4       2            Item5
#> 5   Item5       2            Item5
#> 6   Item6       2            Item5
#> 7   Item7       3            Item7
#> 8   Item8       3            Item7
#> 9   Item9       4           Item10
#> 10 Item10       4           Item10

reprex package (v0.3.0)

于 2020-05-23 创建

我猜您希望质心条目是集群的名称,所以:

Items <-c("ABC","DEF","GHI","JKL","MNO","PQR","STU","VWX")
Cluster <-c(1,1,1,2,2,2,3,3)

df <- data.frame(Items,Cluster)

centroidList <-c(1,5,7)
centroidNames = df$Items[centroidList]
names(centroidNames) = unique(Cluster)

df[["Cluster Centroid"]] = centroidNames[as.character(df$Cluster)]
df

 Items Cluster Cluster Centroid
1   ABC       1              ABC
2   DEF       1              ABC
3   GHI       1              ABC
4   JKL       2              MNO
5   MNO       2              MNO
6   PQR       2              MNO
7   STU       3              STU
8   VWX       3              STU

我觉得如果你用现实生活中的数据集来问会更好,例如:

library(cluster)
data = data.frame(iris[,1:4])
data$Items = paste0("data",1:nrow(data))
clus = pam(data[,-5],3)
data$Cluster = clus$clustering

我们得到这样的质心列表,对应簇1,2和3:

centroidList = data$clus$id.med
centroidNames = data$Items[data$clus$id.med]

在这种情况下,我可以简单地以相同的顺序调用它,因为集群是数字的:

df[["Cluster Centroid"]] = centroidNames[data$Cluster]