Извлеките высоту из каждого узла дендрограммы, используя dendrapply

Наверное, очень просто,

У меня есть dendrogram:

set.seed(1)
my_mat <- matrix(rnorm(100),nrow=10,ncol=10)
my_dend <- as.dendrogram(hclust(dist(my_mat)))

и я хочу использовать dendrapply для извлечения height attribute из каждого node в my_dend, поскольку он пересекает dendrogram в pre-order.

Пробуем пример от dendrapply на my_dend:

dendrapply(my_dend, function(n) utils::str(attributes(n)))

Он не возвращает значение, а печатает нужную мне информацию в pre-order. Я думал, что просто вернуть height attribute так же просто, как:

dendrapply(my_dend, function(n) attr(n,"height"))

но очевидно я не прав.

Есть идеи?


person user1701545    schedule 15.02.2017    source источник


Ответы (3)


Это то, что вы хотите?

sapply(hclust(dist(my_mat)), '[')$height
#[1] 2.195193 2.661372 2.837259 2.890944 3.745600 4.098533 4.177088 5.514541 6.496675
#and order
sapply(hclust(dist(my_mat)), '[')$order
# [1]  4  1 10  8  9  2  5  7  3  6

Также есть dendextend_get_branches_heights в библиотеке dendextend

dendextend_get_branches_heights(my_dend)
#[1] 2.195193 2.661372 2.837259 2.890944 3.745600 4.098533 4.177088 5.514541 6.496675
person d.b    schedule 15.02.2017
comment
Я так не думаю. dendrapply печатает Heights по предварительному заказу, что меня и интересует - person user1701545; 15.02.2017
comment
Я обновил свой вопрос, чтобы указать, что меня интересует предварительный заказ, который, по-видимому, проходит dendrapply, в отличие от циклического обхода объекта hclust или использования dendextend. - person user1701545; 15.02.2017

Чтобы получить высоту всех узлов в вашей дендрограмме, вы можете использовать функцию get_nodes_attr из пакета dendextend.

library(dendextend)
get_nodes_attr(my_dend, "height")

 [1] 6.496675 0.000000 5.514541 3.745600 2.195193 0.000000 0.000000 2.890944
 [9] 0.000000 0.000000 4.177088 2.837259 0.000000 0.000000 4.098533 0.000000
[17] 2.661372 0.000000 0.000000
person G5W    schedule 15.02.2017

Это далеко не элегантно, но работает:

сохранить вывод

dendrapply(my_dend, function(n) utils::str(attributes(n)))

в файл и отредактируйте этот файл:

  out.fn <- "dendrogram.output"
  capture.output(dendrapply(my_dend, function(n) utils::str(attributes(n))),file=out.fn)
  system(paste0("sed -i '/List of/d' ",out.fn))
  system(paste0("sed -i '/\\[\\[/d' ",out.fn))
  system(paste0("sed -i '/NULL/d' ",out.fn))
  system(paste0("sed -i '/^$/d' ",out.fn))
  system(paste0("sed -i '/class/d' ",out.fn))
  system(paste0("sed -i '/midpoint/d' ",out.fn))
  system(paste0("sed -i '/leaf/d' ",out.fn))
  system(paste0("sed -i '/label/d' ",out.fn))
  system(paste0("sed -i '/members/d' ",out.fn))
  system(paste0("sed -i 's/ \\$ //g' ",out.fn))
  system(paste0("perl -i -pe 's/height\\s+:\\s+num\\s+//g' ",out.fn))

  my_dend.df <- dplyr::filter(read.table(out.fn,header=F,sep=",",stringsAsFactors=F,col.names="depth"),depth != 0)

> my_dend.df
  depth
1  6.50
2  5.51
3  3.75
4  2.20
5  2.89
6  4.18
7  2.84
8  4.10
9  2.66
person user1701545    schedule 18.02.2017