【问题标题】:Cluster analysis - match cluster centroids to cluster center item names based on index value聚类分析 - 根据索引值将聚类质心与聚类中心项名称匹配
【发布时间】:2020-09-10 15:55:20
【问题描述】:

我完成了一个聚类分析,并且能够在我的数据集中适当地标记每个“项目”,以确定它属于哪个聚类。

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

我正在尝试获取质心列表中的值并生成一个名为 cluster centroid 的列,该列将我的索引值与“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

【问题讨论】:

  • 欢迎来到 Stack Overflow。一个可重复的例子会有所帮助。查看minimal reproducible exampleHow to Ask 以获得一些有用的指导。
  • @Peter 对此感到抱歉。我刚刚更新了它。我附上了我的最终目标的截图。希望这对社区更有用。
  • 谢谢,我希望答案是你所期望的

标签: r cluster-analysis


【解决方案1】:

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

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]

【讨论】:

    【解决方案2】:

    这就是你可能追求的……

    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
    

    reprex package (v0.3.0) 于 2020 年 5 月 23 日创建

    【讨论】:

    • 谢谢彼得。 “变异”线上到底发生了什么?我不太清楚那里发生了什么。
    • 答案中添加的评论有意义吗?
    • 是的,它看起来像是在连接信息。也许我的数据示例并没有应有的清晰。
    • 我确实需要根据索引值进行匹配。您能否分享一个不需要串联“项目”和与我的质心列表关联的值,而是使用我的索引 (1:10) 的示例?还请假设我的项目并不总是遵循相同的模式 Item1、Item2 等。
    • 要清楚,您的解决方案功能。但在我的实际数据集中(包含我无法在此处发布的私人信息)我无法重新创建它,因为查找项之间的链接不那么直接。
    【解决方案3】:

    这是一个非常基础的 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 年 5 月 23 日创建

    【讨论】:

      猜你喜欢
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2020-02-21
      • 2017-09-12
      • 2017-11-01
      • 2016-12-02
      • 1970-01-01
      相关资源
      最近更新 更多