I have a dendrogram
:
set.seed(10)
mat <- matrix(rnorm(20*10),nrow=20,ncol=10)
dend <- as.dendrogram(hclust(dist(mat)))
And given a depth cutoff:
I'd like to cut all branches that are to the right to that cutoff.
depth.cutoff <- 4.75
I'd like to cut all branches to the right of the dashed line:
plot(dend,horiz = TRUE)
abline(v=depth.cutoff,col="red",lty=2)
And to end up with this dendrogram
:
The closest I got was using ape
's drop.tip
, but the problem with that is if my depth.cutoff
includes all leaves, as in this example, it returns NULL
.
Perhaps anyone knows if and how I can delete elements from the nested list
which represents my dendrogram
if their depth
is below depth.cutoff
?
Alternatively, perhaps I can convert the dendrogram
to a data.frame
, which also lists the depth
of each node
(including leaves which will have depth
=0), remove all rows with depth
<
depth.cutoff
from that data.frame
, and then convert that back to a dendrogram
?
cut
will cut the tree at a specified height. It will return a list of the upper
and lower
portions
cut(dend, h = depth.cutoff)$upper
# $upper
# 'dendrogram' with 2 branches and 5 members total, at height 5.887262
#
# $lower
# $lower[[1]]
# 'dendrogram' with 2 branches and 6 members total, at height 4.515119
#
# $lower[[2]]
# 'dendrogram' with 2 branches and 2 members total, at height 3.789259
#
# $lower[[3]]
# 'dendrogram' with 2 branches and 5 members total, at height 3.837733
#
# $lower[[4]]
# 'dendrogram' with 2 branches and 3 members total, at height 3.845031
#
# $lower[[5]]
# 'dendrogram' with 2 branches and 4 members total, at height 4.298743
plot(cut(dend, h = depth.cutoff)$upper, horiz = T)