2

我想:

  1. 删除一个子树,然后将一个新的子树合并到原始树状图中,使其与被删除的位置相同。
  2. 或用另一个子树替换子树。

我知道merge()可以合并顶部的两个树状图。它是否也在指定节点合并它。如果有怎么办?如果没有,是否有另一种方法可以做到这一点?

我知道cut()将树状图切割成一定高度或特定数量的节点。但是如何让它只删除一个特定的子树呢?

子树的规范将是其中第一个节点的属性。例如attr(n,"attribute")== something,可以通过dendrapply().


这是如何制作树状图的示例代码。

library("stats")
library("fastcluster")

x=matrix(c(1:20),ncol=4)
y=matrix(c(21:40),ncol=4)

#creating hclusters
xcl=hclust.vector(x)
ycl=hclust.vector(y)

#converting to dendrograms
xdend=as.dendrogram(xcl)
ydend=as.dendrogram(ycl)

# merging two dendrograms at the top
zdend=merge(xdend,ydend)

- 注意:我发现了如何通过以下方式替换子树。

 merging <- function(n,subtree){
    if (attr(n,"members")==2){
    treeMerged2<<- merge(n,subtree)}}


     D=rbind(
    + c(1,1,1,1,1),
    + c(1,2,1,1,1),
    + c(2,2,2,2,2),
    + c(2,2,2,2,1),
    + c(3,3,3,3,3),
    + c(3,3,3,3,2))

Ddend=as.dendrogram(hclust.vector(D))

    tr=dendrapply(Ddend,merging, xdend)

问题:

1) 它替换了它的姊妹子树而不是期望的那个。

2)原始树没有改变。

3)创建的新树“treeMerged2”只有添加的子树和姐妹子树,没有树的其余部分。

问题:

  • 如何使输出成为其中包含新子树的原始树?

谢谢。

4

1 回答 1

0

您可以使用包prune中的功能dendextend,专为此类事情设计。(看?prune)。修剪后,您可以使用该merge功能。

如果您需要替换树的特定子部分中的树,我相信目前使用通用功能是不可能的。您可以使用 nestes 手动添加子树[[ ]],但请注意您将获得的属性将不再正确(尤其是成员数,可能还有高度)。因此,您需要更认真地考虑这一点才能普遍解决此问题(如果您要解决此问题,请提交补丁以进行dendextend,或者只是通过电子邮件发送给我:tal.galili@gmail.com)

于 2014-08-11T08:50:28.570 回答