2017-01-05 47 views
1

是否有任何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有序的節點深度(不包括葉)。

感謝

+0

'plotrix'包中名爲'listDepth'的函數看起來可以工作。標題是「查找列表的最大深度」。 – lmo

回答

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 
+0

最好在代碼中包含一些上下文/解釋,因爲這會使OP對未來的讀者更有用。 – EJoshuaS

1

您可以輕鬆地編寫一個這樣的:

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

你能得到這個返回節點高度的bfs排序向量嗎? – dan

1

請參閱從dendextendget_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) 

它似乎並不完全同youu希望的順序,但看這仍然是有用的:

> 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 

BTW,dendextend近期GitHub的版本還配備了highlight_branches功能

plot(highlight_branches(dend)) 

enter image description here

:基於分支高度(在此情況下,以某種方式與你的動機)着色分行