如何在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包提供了便捷的节点属性提取函数,步骤如下:
- 安装并加载包:
install.packages("dendextend") library(dendextend)
- 转换对象并提取叶节点高度:
# 将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
相关产品推荐
相关产品推荐

