在特定节点处合并两个树形图

时间:2012-07-30 10:41:18

标签: r dendrogram dendextend

我想要:

  1. 删除子树,然后将新子树合并到原始树形图中,使其与移除的子树位于相同的位置。
  2. 或用另一个替换子树。
  3. 我知道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”只有添加的子树和姐妹子树,而不是树的其余部分。

    问题:

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

    感谢。

1 个答案:

答案 0 :(得分:0)

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

如果您需要替换树的特定子部分中的树,我相信目前使用通用功能不可能。您可以使用nestes [[ ]]手动添加子树,但请注意,您将获得的属性将不再正确(尤其是成员数,也可能是高度)。所以你需要更认真地考虑这个问题,以便一般地解决这个问题(如果你要解决它,感觉被邀请提交一个补丁到dendextend,或者只是给我发电子邮件:tal.galili@gmail.com)< / p>