You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:37:51