聚类分析——根据索引值将聚类质心与聚类中心项名称匹配
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]
我完成了聚类分析,并且能够在我的数据集中适当地标记每个 '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]