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

时间:2017-01-05 20:53:22

标签: r breadth-first-search dendrogram

是否有任何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排序的节点深度(不包括叶子)。

由于

3 个答案:

答案 0 :(得分:1)

您可以轻松编写如下代码:

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

答案 1 :(得分: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

答案 2 :(得分:1)

请参阅dendextend中的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

它似乎并不完全按照你想要的顺序,但看看它是否仍然有用:

highlight_branches
BTW,最近github版本的dendextend还带有plot(highlight_branches(dend)) 函数,用于根据分支高度对分支进行着色(如果这与你的动机有某种关系):

.siblings()

enter image description here