rlistdendrogramape

Cut a dendrogram


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)

enter image description here

And to end up with this dendrogram:

enter image description here

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?


Solution

  • 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)
    

    enter image description here