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

如何在R语言中提取树状图(dendrogram)各叶节点的高度?

提取树状图叶节点高度的方法

问题描述

树状图

希望从上述树状图中提取每个叶节点的高度,期望输出格式如下:

list("A" = 2.07, "B" = 5.09, "C" = 3.12, "D" = 2.07, "E" = 3.12)

生成该树状图的示例代码:

m <- matrix(rnorm(30), nrow = 5)
rownames(m) <- LETTERS[1:5]
d <- dist(m)

h <- hclust(d)
plot(h)

目前已尝试通过h$height提取树状图高度,用str(as.dendrogram(h))查看结构信息,但无法直接提取目标内容;也试过dendextend包,未找到对应方法。因对S3对象不熟悉,询问是否有现成函数实现该需求。

解决方案

方法一:使用dendextend包

dendextend包提供了便捷的节点属性提取函数,步骤如下:

  1. 安装并加载包:
install.packages("dendextend")
library(dendextend)
  1. 转换对象并提取叶节点高度:
# 将hclust对象转为dendrogram对象
dend <- as.dendrogram(h)
# 获取所有节点的高度和标签
all_heights <- get_nodes_attr(dend, "height")
all_labels <- get_nodes_attr(dend, "label")
# 筛选叶节点(标签非空的节点)
leaf_pos <- which(!is.na(all_labels))
leaf_heights <- all_heights[leaf_pos]
names(leaf_heights) <- all_labels[leaf_pos]
# 转为目标列表格式
result_list <- as.list(leaf_heights)

方法二:基础R递归实现

无需额外包,通过递归遍历dendrogram对象提取叶节点信息:

dend <- as.dendrogram(h)

# 定义递归提取函数
extract_leaf_heights <- function(node) {
  if (is.leaf(node)) {
    return(setNames(list(attr(node, "height")), attr(node, "label")))
  } else {
    c(extract_leaf_heights(node[[1]]), extract_leaf_heights(node[[2]]))
  }
}

# 执行提取
result_list <- extract_leaf_heights(dend)

两种方法最终都会得到你需要的叶节点高度列表,格式与预期一致。

内容的提问来源于stack exchange,提问作者Marc Antoine Gerault

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:27:23