2012-07-30 87 views
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」只有附加的子樹和姐妹子樹,而不是樹的其餘部分。

問:

  • 我如何使輸出是原來的樹在它新的子樹?

謝謝。

回答

0

您可以使用dendextend包中的prune函數,該函數包完全爲此類設計而設計。 (看看?prune)。一旦修剪,您可以使用merge功能。

如果您需要替換樹的特定子部分中的樹,我相信這是目前不可能使用通用函數。您可以使用nestes [[ ]]手動添加子樹,但請注意,您將獲得的屬性將不再正確(特別是成員數量,也可能是高度)。因此,爲了解決這個問題,您需要更加認真地考慮這個問題(如果您需要解決這個問題,可以邀請提交補丁給dendextend,或者發郵件給我:[email protected]