基于R的hierarchical clustering:如何确定各组包含的观测样本
解决层次聚类后查询各组样本的问题
嗨,这个问题我太熟了!当样本量超大时,树状图确实没法看清每个样本的分组,不过R里有个超级实用的工具可以帮你轻松提取各组的样本,下面给你一步步拆解操作:
核心方法:用cutree()提取分组
不管你是用基础包的hclust()还是cluster包的agnes()做层次聚类,cutree()都能直接把聚类结果拆分成指定数量的组,然后就能轻松查看每个组里的样本了。
步骤1:先完成层次聚类(回顾流程)
假设你已经有了自己的海量数据集,这里用mtcars做示例(原理完全适用于大样本):
# 加载数据并标准化(层次聚类建议先标准化变量) data(mtcars) scaled_data <- scale(mtcars) # 计算距离矩阵(比如欧氏距离) dist_matrix <- dist(scaled_data, method = "euclidean") # 执行层次聚类(这里用ward.D2方法,你可以换成自己用的方法) hc <- hclust(dist_matrix, method = "ward.D2")
步骤2:确定聚类组数
你可以通过绘制树状图来判断合适的组数:
plot(hc) # 如果样本太多树状图挤在一起,也可以用`rect.hclust()`给不同组加框,辅助判断 rect.hclust(hc, k = 3, border = 2:4) # 比如假设分成3组
或者你也可以根据聚类树的高度来分组(比如h=5,对应树状图上的高度刻度)。
步骤3:提取各组的样本
方法1:生成每个样本的组标签
用cutree()生成每个样本对应的组号:
# 按组数k拆分,比如k=3 cluster_labels <- cutree(hc, k = 3) # 或者按高度h拆分:cluster_labels <- cutree(hc, h = 5) # 查看带样本名的组标签(直接看哪些样本在哪个组) cbind(Sample_Name = rownames(mtcars), Cluster_Number = cluster_labels)
方法2:拆分数据集到各个组
如果需要查看每组的完整数据,可以用split()把原始数据按组拆分:
# 按聚类标签拆分数据 grouped_data <- split(mtcars, cluster_labels) # 查看第1组的所有样本数据 grouped_data[[1]] # 只看第2组的样本名称 rownames(grouped_data[[2]])
注意:如果你的数据集特别大,split()可能会占用较多内存,此时优先用下面的方法提取样本名称更高效。
方法3:提取特定组的样本
如果你只需要某一组的样本,直接用subset()或者索引提取:
# 提取第3组的样本数据 subset(mtcars, cluster_labels == 3) # 只提取第3组的样本名称 rownames(mtcars)[cluster_labels == 3]
方法4:统计各组样本数量
快速看一下每个组有多少样本:
table(cluster_labels)
如果你用的是cluster包的agnes()聚类
方法完全一致,cutree()同样支持agnes对象:
library(cluster) agn <- agnes(scaled_data, method = "ward") cluster_labels_agn <- cutree(agn, k = 3)
内容的提问来源于stack exchange,提问作者Adeeba Naseem
相关产品推荐
相关产品推荐

