在给定深度截止值的分支下留下名称

时间:2017-01-08 10:10:31

标签: r tree dendrogram dendextend

我想知道dendrogram给定深度中断的方式,我可以在深度截止点以下的每个分支获得所有叶子的名称列表。它的后代。

例如,我创建了这个dendrogram

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

使用dendextend绘图:

require(dendextend)
dend %>% plot

将深度截止值定义为14.5:

abline(h=14.5,col="red")

enter image description here

我的清单应该是:

list(c(5),c(7),c(8),c(10,4,9),c(3,6,1,2))

2 个答案:

答案 0 :(得分:1)

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

require(dendextend)
dend %>% plot
abline(h=14.5,col="red")

cutree中的function dendextend接受高度截止值,并返回具有群组成员资格的整数vector

> cutree(dend,h=14.5)
 1  2  3  4  5  6  7  8  9 10 
 1  1  1  2  3  1  4  5  2  2 

答案 1 :(得分:0)

不完全确定这是否是您所追求的答案,但您可以像这样访问它们吗?

acme$Accounting$children %>% names()
"New Software"             "New Accounting Standards"

acme$IT$children %>% names()
"Outsource"   "Go agile"    "Switch to R"

大概你想自动这样做,所以它就像

names = c('Accounting', 'IT')
sapply(names, function(x) acme[[x]]$children %>% names(.))

我认为可能有一种更优雅的方式来做到这一点,但这看起来并不是一种可怕的方式。

修改

由于用户完全改变了问题,这里是一个新答案:

get_height = function(x){
  a = attributes(x)
  a$height
}

height = 14
dendrapply(dend, function(x) ifelse(get_height(x) < height, x, '')) %>% unlist()

您只需要访问树形图中每个终端节点的高度,并确定它是否高于或低于您想要的高度。不幸的是,这不会将来自同一父节点的叶节点组合在一起 - 但是,这不应该太难以添加一些修补。希望这能让你顺利上路。