R中hclust绘制层次聚类树状图无法显示样本名称仅显示数字标识的问题
问题核心成因
从你提供的dput(head(df2))结果可以看到,你的数据框存在两个关键结构差异,直接导致了后续异常:
- 你把国家名称作为了数据框的第一列(且该列没有正式列名),而没有将国家名设置为数据框的行名:当前df2的行名是R默认生成的1、2、3...数字序列,这也是树状图只显示数字标签的根本原因。
- 因为把字符型的国家名放在了数据列里,
dist()函数要求输入全为数值类型的数据集,因此计算距离时会尝试把字符列强制转成数值,触发了“NAs introduced by coercion”的警告。这种情况下算出的距离矩阵本身是无效的——字符列转NA后,欧氏距离计算会丢失对应维度的信息,得到的聚类结果并不具备参考性。
你观察到的USArrests能正常显示标签,本质是这个数据集的州名是存在行名属性里的,所有数据列都是纯数值,既不会触发距离计算警告,hclust也会自动提取行名作为树状图的节点标签。你看到的“右对齐/左对齐”只是R控制台打印数据框的格式差异,和功能逻辑没有关系。
修正操作步骤
- 第一步:将存储国家名的第一列提取为数据框的行名,删除该非数值列
# 提取第一列的国家名设为行名 rownames(df2) <- df2[[1]] # 移除原第一列的国家名,保留纯数值的统计列 df2 <- df2[, -1]
- 第二步:验证数据结构是否符合计算要求
运行rownames(df2),如果输出是各个国家名称而非1、2、3的数字序列,且所有列都是数值类型,说明结构修正完成。这时候再运行dist(df2)将不会出现之前的强制转换警告。 - 第三步:重新执行层次聚类与绘图
d2 <- hclust(dist(df2)) plot(d2, hang = -1)
执行后树状图的叶子节点就会自动对应显示样本的国家名称,和USArrests的运行效果一致。
内容的提问来源于stack exchange,提问作者Luis Carvacho
相关产品推荐
相关产品推荐

