作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有一种简单的方法来计算 h
的最小值?在 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
hc$height
中给出,我可以使用
hc$height + 0.00001
创建一组候选值然后循环遍历它们中的每一个。但是,我不知道如何解析集群大小
members
出了
dendrogram
类(class)。例如,
cut(as.dendrogram(hc), h=3.80)$lower[[1]]$members
返回
NULL
, 不是 66 所期望的。
dynamicTreeCut
;在这里我没有指定树的数量,只是最小的集群大小。 TYVM。
最佳答案
感谢@Vlo 和@lukeA,我能够实现一个循环。但是,我只是将其发布为一个起点,并且肯定会采用更优雅的解决方案。
unnest <- function(x) { # from Vlo's answer
if(is.null(names(x))) x
else c(list(all=unname(unlist(x))), do.call(c, lapply(x, unnest)))
}
cuts <- hc$height + 1e-9
min_size <- 10
smallest <- 0
i <- 0
while(smallest < min_size & i <= length(cuts)){
h_i <- cuts[i <- i+1]
if(i > length(cuts)){
warning("Couldn't find a cluster big enough.")
}
else smallest <-
Reduce(min,
lapply(X = unnest(cut(as.dendrogram(hc), h=h_i)$lower),
FUN = attr, which = "members") ) # from lukeA's comment
}
h_i # returns desired output: [1] 3.79211
关于R将树状图切割成最小尺寸的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31124810/
我是一名优秀的程序员,十分优秀!