如何提取树状图中高度较高的节点下的标签?

时间:2019-09-10 14:17:06

标签: r dendrogram

我有一个树状图,我想提取一个我已经知道其高度的节点下的所有标签。例如:

data = data.frame(point = c('A','B','C','D','E'), 
                  x = c(2,2.5,2.1,3,5), 
                  y = c(3.1,4,5,6,2))
d = dist(as.matrix(data[, 2:3])) 
hc = hclust(d,method = "ward.D2")
plot(hc, labels = data$point)

Dendrogram

我们知道所有节点的高度:

hc$height
# [1] 1.029563 1.345362 2.790161 4.584430

现在,我想知道某个高度下的所有标签,例如,高度等于1.029563,我希望结果c("A", "B"),高度等于1.345362,我希望结果{{1 }}。

请问有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

如果您参考?hclust,将会看到关于merge组件是什么的令人困惑的解释。在示例中,您给出了:

hc$merge
#      [,1] [,2]
# [1,]   -1   -2
# [2,]   -3   -4
# [3,]    1    2
# [4,]   -5    3

还有:

hc$height
# [1] 1.029563 1.345362 2.790161 4.584430

您可以看到节点的高度从最低到最高依次排列。 因此,在该编号的节点下合并的点比其低的点:


for (node in 1:length(hc$height)) {          # roll over the nodes
  points <- hc$merge[1:node, ]               # look at the relevant rows
  points_under_node <- -points[points < 0]   # negative values are points
  print(points_under_node)                   # points numbers
  print(c("node = ", node))                  # node number
  print(data$point[points_under_node])       # point names under node
}

有点,但我希望这能说明问题。

答案 1 :(得分:0)

利用@nicola的提示和@Ronny Efronny的答案,我试图制作出可以产生所需结果的代码(尽管它们看上去不太好):

A = hc$merge
labelList = c()
for (i in seq(1, max(clusters)-1)){
  if((A[i,1]<0) & (A[i,2]<0)){
    labelList[[i]] = c(-A[i,])
  }
  else if((A[i,1]<0) & (A[i,2]>0)){
    labelList[[i]] = c(-A[i,1], labelList[[A[i,2]]])
  }
  else if((A[i,1]>0) & (A[i,2]<0)){
    labelList[[i]] = c(-A[i,2], labelList[[A[i,1]]])
  }
  else if((A[i,1]>0) & (A[i,2]>0)){
    labelList[[i]] = c(labelList[[A[i,1]]], labelList[[A[i,2]]])
  }
}

然后labelList[[i]]给出结果与hc$height[i]的节点相对应。

如果有人可以帮助我编辑代码,使它们看起来更漂亮,那就太好了:))