聚类分析--根据指数值将聚类中心项与聚类中心项名称进行匹配。

问题描述 投票:0回答:1

我完成了一个聚类分析,并且能够在我的数据集中对每个 "项目 "进行适当的标记,说明它属于哪个聚类。

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

我试图将中心列表中的值,生成一个叫做簇中心的列,将我的索引值与'Item'的值相匹配,然后填充该'Item'的值,但不清楚如何在R中进行这个操作。

我试着做了一些ifthen语句,但没有什么运气。

有什么好的建议吗?

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

输出示例

r cluster-analysis
1个回答
0
投票

我猜你希望中心项是聚类的名称,所以。

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]

1
投票

这就是你可能想要的... ...

library(dplyr)

创建一个映射数据框架

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

简单地进行左联接,将centroidList映射到簇上。

然后创建一个新的变量。Cluster Centroid 通过连接或 paste0 的文字 "项目 "和 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

创建于2020-05-23。重读包 (v0.3.0)


0
投票

这是一个非常基础的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

创建于2020-05-23 重读包 (v0.3.0)

© www.soinside.com 2019 - 2024. All rights reserved.