【问题标题】:R: How to extract all labels in a certain node of a dendrogramR:如何提取树状图某个节点中的所有标签
【发布时间】:2018-08-26 10:40:12
【问题描述】:

我正在编写一个程序(作为它的一部分)自动从输入数据集创建树状图。 对于 每个 节点/拆分,我想提取 all 该节点下的标签 该节点在树状图上的位置(对于进一步的绘图目的)。 所以,假设我的数据如下所示:

> Ltrs <- data.frame("A" = c(3,1), "B" = c(1,1), "C" = c(2,4), "D" = c(6,6))
> dend <- as.dendrogram(hclust(dist(t(Ltrs))))
> plot(dend)

The dendrogram

现在我可以提取分割/节点的位置:

> library(dendextend)
> nodes <- get_nodes_xy(dend)
> nodes <- nodes[nodes[,2] != 0, ]
> nodes
      [,1]     [,2]
[1,] 1.875 7.071068
[2,] 2.750 3.162278
[3,] 3.500 2.000000

现在我想为每个节点获取一个节点下的所有标签(/row 来自“nodes”变量)。

这应该看起来像这样:

$`1`
[1] "D" "C" "B" "A"

$`2`
[1] "C" "B" "A"

$`3 `
[1] "B" "A"

谁能帮帮我?在此先感谢:)

【问题讨论】:

  • 我发现使用树状图结构非常令人困惑。使用hclust 对象和cutree 可能会容易得多。你剪了例如循环不同的k 选项以到达节点。

标签: r nodes labels dendrogram members


【解决方案1】:

这样的事情怎么样?

library(tidyverse)
library(dendextend)
Ltrs <- data.frame("A" = c(3,1), "B" = c(1,1), "C" = c(2,4), "D" = c(6,6))
dend <- as.dendrogram(hclust(dist(t(Ltrs))))

accumulator <- list();
myleaves <- function(anode){
    if(!is.list(anode))return(attr(anode,"label"))
    accumulator[[length(accumulator)+1]] <<- (reduce(lapply(anode,myleaves),c))
}

myleaves(dend);
ret <- rev(accumulator); #generation was depth first, so root was found last.

最好对此进行测试。我不是很值得信赖。特别是,我真的希望列表 ret 的顺序是有意义的,否则将条目与正确的节点关联起来会很痛苦!祝你好运。

【讨论】:

  • 谢谢史蒂夫。确实 ret 列表的顺序有点奇怪。我认为它与 hclust$merge 变量中的顺序相同。我会调查一下,再次感谢
【解决方案2】:

函数partition_leaves() 提取每个节点的所有叶标签,并以与get_nodes_xy() 输出相同的方式排序列表。以你的例子,

Ltrs <- data.frame("A" = c(3,1), "B" = c(1,1), "C" = c(2,4), "D" = c(6,6))
dend <- as.dendrogram(hclust(dist(t(Ltrs))))
plot(dend)

partition_leaves(dend)

产量:

[[1]]
[1] "D" "C" "A" "B"

[[2]]
[1] "D"

[[3]]
[1] "C" "A" "B"

[[4]]
[1] "C"

[[5]]
[1] "A" "B"

[[6]]
[1] "A"

[[7]]
[1] "B"

按向量长度过滤列表将给出与所需相似的输出。

【讨论】:

    猜你喜欢
    • 2020-01-12
    • 2021-12-23
    • 2016-07-27
    • 2012-11-09
    • 1970-01-01
    • 2019-07-15
    • 2016-02-10
    • 2012-12-16
    相关资源
    最近更新 更多