以广度优先搜索顺序获取树状图的分​​支长度

Getting a dendrogram's branch lengths in a breadth-first-search order

是否有任何 R 函数来检索树状图的分​​支长度:

set.seed(1)
mat <- matrix(rnorm(100*10),nrow=100,ncol=10)
dend <- as.dendrogram(hclust(dist(t(mat))))

按广度优先搜索顺序?

对于 dend 我想得到这个结果:

c(16.38688,15.41441,15.99504,14.68365,13.52949,14.39275,12.96921,13.91157,13.15395)

这是按 bps 排序的节点深度(不包括叶子)。

谢谢

您可以像这样轻松编写代码:

dendro_depth <- function(dendro){
  if(!is.null(attributes(dendro)$leaf))
    0
  else
    max(dendro_depth(dendro[[1]]),dendro_depth(dendro[[2]])) +1
}

数据:

set.seed(1)
mat <- matrix(rnorm(100*10),nrow=100,ncol=10)
dend <- as.dendrogram(hclust(dist(t(mat))))    

使用 data.tree 包允许以各种顺序遍历树。 level 将给出问题指定的内容:

require(data.tree)
dend.dt <- as.Node(dend)
sapply(Traverse(dend.dt,traversal = "level", pruneFun = isNotLeaf),function(x) x$plotHeight)
[1] 16.38688 15.41441 15.99504 14.68365 13.52949 14.39275 12.96921 13.91157 13.15395

参见 dendextend 中的 get_branches_heights

set.seed(1)
mat <- matrix(rnorm(100*10),nrow=100,ncol=10)
dend <- as.dendrogram(hclust(dist(t(mat))))

library(dendextend)
get_branches_heights(dend, sort = F)

这似乎不是你想要的顺序,但看看这是否仍然有用:

> get_branches_heights(dend, sort = F)
[1] 16.38688 15.41441 14.68365 15.99504 13.52949
[6] 12.96921 14.39275 13.91157 13.15395

顺便说一句,最近的 github 版本的 dendextend 还带有 highlight_branches 功能,用于根据分支高度为分支着色(以防这与您的动机有关):

plot(highlight_branches(dend))