Allows easy access to attributes of branches and/or leaves, with option of returning a vector with/withough NA's (for marking the missing attr value)

get_nodes_attr(
  dend,
  attribute,
  id,
  include_leaves = TRUE,
  include_branches = TRUE,
  simplify = TRUE,
  na.rm = FALSE,
  ...
)

Source

Heavily inspired by the code in the function labels.dendrogram, so credit should go to Martin Maechler.

Arguments

dend

a dendrogram object

attribute

character scalar of the attribute (attr) we wish to get from the nodes

id

integer vector. If given - only the attr of these nodes id will be returned (via depth first search)

include_leaves

logical. Should leaves attributes be included as well?

include_branches

logical. Should non-leaf (branch node) attributes be included as well?

simplify

logical (default is TRUE). should the result be simplified to a vector (using simplify2array ) if possible? If it is not possible it will return a matrix. When FALSE, a list is returned.

na.rm

logical. Should NA attributes be REMOVED from the resulting vector?

...

not used

Value

A vector with the dendrogram's nodes attribute. If an attribute is missing from some nodes, it will return NA in that vector.

Examples

# define dendrogram object to play with:
hc <- hclust(dist(USArrests[1:3, ]), "ave")
dend <- as.dendrogram(hc)

# get_leaves_attr(dend) # error :)
get_leaves_attr(dend, "label")
#> [1] "Arizona" "Alabama" "Alaska" 
labels(dend, "label")
#> [1] "Arizona" "Alabama" "Alaska" 
get_leaves_attr(dend, "height") # should be 0's
#> [1] 0 0 0
get_nodes_attr(dend, "height")
#> [1] 54.80041  0.00000 37.17701  0.00000  0.00000


get_leaves_attr(dend, "leaf") # should be TRUE's
#> [1] TRUE TRUE TRUE
get_nodes_attr(dend, "leaf") # conatins NA's
#> [1]   NA TRUE   NA TRUE TRUE


get_leaves_attr(dend, "members") # should be 1's
#> [1] 1 1 1
get_nodes_attr(dend, "members", include_branches = FALSE, na.rm = TRUE) #
#> [1] 1 1 1
get_nodes_attr(dend, "members") #
#> [1] 3 1 2 1 1
get_nodes_attr(dend, "members", simplify = FALSE)
#> [[1]]
#> [1] 3
#> 
#> [[2]]
#> [1] 1
#> 
#> [[3]]
#> [1] 2
#> 
#> [[4]]
#> [1] 1
#> 
#> [[5]]
#> [1] 1
#> 
get_nodes_attr(dend, "members", include_leaves = FALSE, na.rm = TRUE) #
#> [1] 3 2

get_nodes_attr(dend, "members", id = c(1, 3), simplify = FALSE)
#> [[1]]
#> [1] 3
#> 
#> [[2]]
#> [1] 2
#> 
get_nodes_attr(dend, "members", id = c(1, 3)) #
#> [1] 3 2


hang_dend <- hang.dendrogram(dend)
get_leaves_attr(hang_dend, "height") # no longer 0!
#> [1] 49.32037 31.69697 31.69697
get_nodes_attr(hang_dend, "height") # does not include any 0s!
#> [1] 54.80041 49.32037 37.17701 31.69697 31.69697

# does not include leaves values:
get_nodes_attr(hang_dend, "height", include_leaves = FALSE)
#> [1] 54.80041       NA 37.17701       NA       NA
# remove leaves values all together:
get_nodes_attr(hang_dend, "height", include_leaves = FALSE, na.rm = TRUE)
#> [1] 54.80041 37.17701
if (FALSE) {
library(microbenchmark)
# get_leaves_attr is twice faster than get_nodes_attr
microbenchmark(
  get_leaves_attr(dend, "members"), # should be 1's
  get_nodes_attr(dend, "members", include_branches = FALSE, na.rm = TRUE)
)
}