R将树状图切成最小的组

C8H*_*4O2 5 r dendrogram hclust

是否有一种简单的方法来计算hin的最小值,以cut产生给定最小尺寸的分组?

在此示例中,如果我希望每个集群至少包含十个成员,则应使用h = 3.80

# using iris data simply for reproducible example
data(iris)
d <- data.frame(scale(iris[,1:4]))
hc <- hclust(dist(d))
plot(hc)

cut(as.dendrogram(hc), h=3.79) # produces 5 groups; group 4 has 7 members

cut(as.dendrogram(hc), h=3.80) # produces 4 groups; no group has <10 members
Run Code Online (Sandbox Code Playgroud)

由于分割的高度在中给出hc$height,因此我可以使用创建一组候选值hc$height + 0.00001,然后在每个分割处循环进行切割。不过,我不明白如何解析簇大小members出的dendrogram类。例如,cut(as.dendrogram(hc), h=3.80)$lower[[1]]$members返回NULL,而不是所需的66。

请注意,这是一个比使用包将树状图切成R中最小簇大小的n棵树更简单的问题dynamicTreeCut; 在这里,我没有指定树木的数量,而只是指定了最小的群集大小。TYVM。

Vlo*_*Vlo 1

这并不能回答问题,但members如果您决定循环遍历h.

从这里窃取并修改一些代码

# Unnest the list/dendogram structure
unnest <- function(x) {
  if(is.null(names(x))) {
    x
  }
  else {
    c(list(all=unname(unlist(x))), do.call(c, lapply(x, unnest)))
  }
}

# Extract the `members` attribute from each dendogram
lapply(X = unnest(cut(as.dendrogram(hc), h=3.8)), FUN = attr, which = "members")
Run Code Online (Sandbox Code Playgroud)

输出:

# Please don't ask me why there are 2 dendograms stored
# in the `$upper` list while `print` displays one

$upper1
[1] 2

$upper2
[1] 2

$lower1
[1] 66

$lower2
[1] 11

$lower3
[1] 24

$lower4
[1] 49
Run Code Online (Sandbox Code Playgroud)