R:如何提取树状图某个节点中的所有标签
R: How to extract all labels in a certain node of a dendrogram
我正在编写一个程序(作为它的一部分)自动从输入数据集创建树状图。
对于 each node/split 我想提取 all 该节点下的标签 and该节点在树状图上的位置(用于进一步绘图)。
因此,假设我的数据如下所示:
> 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
现在我可以提取 splits/nodes 的位置:
> 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 from the 'nodes' variable)。
这应该看起来像这样:
$`1`
[1] "D" "C" "B" "A"
$`2`
[1] "C" "B" "A"
$`3 `
[1] "B" "A"
有人能帮帮我吗?提前致谢:)
这样的怎么样?
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 的顺序有意义,否则将条目与正确的节点相关联会很痛苦!祝你好运。
函数 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"
按向量长度过滤列表将得到与所需结果相似的输出。
我正在编写一个程序(作为它的一部分)自动从输入数据集创建树状图。 对于 each node/split 我想提取 all 该节点下的标签 and该节点在树状图上的位置(用于进一步绘图)。 因此,假设我的数据如下所示:
> 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
现在我可以提取 splits/nodes 的位置:
> 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 from the 'nodes' variable)。
这应该看起来像这样:
$`1`
[1] "D" "C" "B" "A"
$`2`
[1] "C" "B" "A"
$`3 `
[1] "B" "A"
有人能帮帮我吗?提前致谢:)
这样的怎么样?
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 的顺序有意义,否则将条目与正确的节点相关联会很痛苦!祝你好运。
函数 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"
按向量长度过滤列表将得到与所需结果相似的输出。