【问题标题】:How to extract the labels under some node with height in dendrogram?如何在树状图中提取某个具有高度的节点下的标签?
【发布时间】:2020-01-12 07:51:14
【问题描述】:

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

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)

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

hc$height
# [1] 1.029563 1.345362 2.790161 4.584430

现在我想知道某个高度下的所有标签,例如,高度等于 1.029563,我期望结果为c("A", "B"),高度等于 1.345362,我期望结果为c("C", "D")

有人可以帮忙吗?

【问题讨论】:

  • 参见?hclust中的merge组件含义,Value部分。

标签: r dendrogram


【解决方案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
}

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

【讨论】:

  • 感谢您的回答,但根据您的建议,我得到的结果似乎与我的预期不同。但是我已经制作了其他一些“不确定”的代码来获得我想要的东西。稍后我会发布它:)) 再次感谢
  • @liverpool29 我编辑了最后一位,它现在应该打印出AE 的实际点。可以更改此循环以将点保存在其他地方,打印只是为了展示。希望这会有所帮助。
【解决方案2】:

在@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]节点对应的结果。

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

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 2016-07-27
    • 2018-10-06
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    相关资源
    最近更新 更多