How to access attributes of a dendrogram in R

2019-08-03 20:57发布

From a dendrogram which i created with

hc<-hclust(kk)
hcd<-as.dendrogram(hc)

i picked a subbranch

k=hcd[[2]][[2]][[2]][[2]][[2]][[2]][[2]][1]

When i simply have k displayed, this gives:

> k
[[1]]
[[1]][[1]]
[1] 243
attr(,"label")
[1] "NAfrica_002"
attr(,"members")
[1] 1
attr(,"height")
[1] 0
attr(,"leaf")
[1] TRUE

[[1]][[2]]
[1] 257
attr(,"label")
[1] "NAfrica_016"
attr(,"members")
[1] 1
attr(,"height")
[1] 0
attr(,"leaf")
[1] TRUE

attr(,"members")
[1] 2
attr(,"midpoint")
[1] 0.5
attr(,"height")
[1] 37

How can i access, for example, the "midpoint" attribute, or the second of the "label" attributes?

(I hope i use the correct terminology here)

I have tried things like

k$midpoint
attr(k,"midpoint")

but both returned 'NULL'.

Sorry for question number 2: how could i add a "label" attribute after the attribute "midpoint"?

2条回答
倾城 Initia
2楼-- · 2019-08-03 21:23

Your k is still buried one layer too deep. The attributes have been set on the first element of the list k.

 attributes(k[[1]]) # Display attributes
 attributes(k[[1]])$label # Access attributes
 attributes(k[[1]])$label <- 'new' # Change attribute

Alternatively, you can use attr:

attr(k[[1]],'label') # Display attribute
查看更多
劳资没心,怎么记你
3楼-- · 2019-08-03 21:23

You can change parameters manually as in the previous answer. The problem with this is that it is not efficient to do manually when you want to do it many times. Also, while it is easy to change parameters - that change may not be reflected in any other function, since they won't implement any action based on that change (it must be programmed).

For your specific question - it generally depends on which attribute we want to view. For "midpoint", use the get_nodes_attr function, with the "midpoint" parameter - from the dendextend package.

# install.packages("dendextend")
library(dendextend)

dend <- as.dendrogram(hclust(dist(USArrests[1:5,])))
# Like: 
# dend <- USArrests[1:5,] %>% dist %>% hclust %>% as.dendrogram

# midpoint for all nodes
get_nodes_attr(dend, "midpoint")

And you get this:

[1] 1.25   NA 1.50 0.50   NA   NA 0.50   NA   NA

To also change an attribute, you can use the various assign functions from the package: assign_values_to_leaves_nodePar, assign_values_to_leaves_edgePar, assign_values_to_nodes_nodePar, assign_values_to_branches_edgePar, remove_branches_edgePar, remove_nodes_nodePar

If all you want is to change the labels, the following ability from the package would solve your question:

> labels(dend)
[1] "Arkansas"   "Arizona"    "California" "Alabama"    "Alaska"    
> labels(dend) <- 1:5
> labels(dend)
[1] 1 2 3 4 5

For more details on the package, you can have a look at its vignette.

查看更多
登录 后发表回答