2017-01-05 24 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) 

который глубины узла (за исключением листьев), заказанные базисных пунктов.

Благодаря

+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

См get_branches_heights от 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) 

Это не кажется, что именно в том порядке, 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 

Кстати, последние версии GitHub из dendextend также поставляются с highlight_branches функции для окраска ветвей на основе высоты ветви (в случае, если это как-то связано с вашей мотивации):

plot(highlight_branches(dend)) 

enter image description here