我有一个树状图,我想提取一个我已经知道其高度的节点下的所有标签。例如:
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,我希望结果{{1 }}。
请问有人可以帮忙吗?
答案 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]
的节点相对应。
如果有人可以帮助我编辑代码,使它们看起来更漂亮,那就太好了:))