1

我创建了一个分类并将 iris 数据集分为三类。之后,我想将类(颜色)与数据集中的观察结果联系起来。我尝试使用一个cutree函数。结果,我得到了从 1 到 3 的类和从 1 到 3 的分支,但它们并不相同 - 第一类是第三个分支,第二个类是第一类,第三类是第二个分支。如何正确链接输出类(基于cutree)和绘图中的分支?

> library('dendextend')
> library('tidyverse')
> iris <- datasets::iris
> iris2 <- iris[,-5]
> d_iris <- dist(iris2)
> hc_iris <- hclust(d_iris, method = "complete")
> dend <- as.dendrogram(hc_iris)
> dend <- color_branches(dend, h = 3.5)
> dend <- color_labels(dend, h = 3.5)
> plot(dend)

在此处输入图像描述

> cuts <- cutree(dend, h=3.5)
> data_frame(class=cuts, obj=as.numeric(names(cuts))) %>% 
+         group_by(class) %>%
+         summarise(n())
# A tibble: 3 × 2
  class `n()`
  <int> <int>
1     1    50
2     2    72
3     3    28
> plot(cut(dend, h=3.5)$upper)

在此处输入图像描述

4

1 回答 1

1

dendextend 包中的函数有一个名为的参数,cutree order_clusters_as_data是一个逻辑参数,允许您按照原始数据的顺序 (TRUE) 或树状图上的标签顺序 (FALSE) 对集群进行排序。默认值为 TRUE,但由于 cut 函数根据树状图上的顺序对分支进行编号,因此您需要order_clusters_as_data = FALSE

cuts <- cutree(dend, h=3.5, order_clusters_as_data=FALSE)
data_frame(class=cuts, obj=as.numeric(names(cuts))) %>% 
     group_by(class) %>%
     summarise(n())
# A tibble: 3 × 2
  class `n()`
  <int> <int>
1     1    72
2     2    28
3     3    50
plot(cut(dend, h=3.5)$upper)
于 2017-01-20T18:14:13.263 回答