2012-09-09 5 views
0

주어진 dendrogram (2 진 트리)의 모든 노드에 식별자를 적용하는 함수가 있는지 알고 싶습니다.dendrogram의 노드에 ID를 적용하는 기능

그래서 나는 주어진 나무에 후 것은 할 것이라고 기능을 원하는 다음

attr(tr,"ID")    ## should give 1 or 1 

attr(tr[[1]],"ID")  ## should give 2 or 10 

attr(tr[[2]],"ID")  ## should give 3 or 11 

attr(tr[[c(1,1)]],"ID") ## should give 4 or 100 

등 ...

그리고, binaryID와 헤드 노드의 110 (ID를 시작하는 데 주어진 경우)

그것은 첫째 자식 ID는 그것의 두번째 자식 ID가 있어야합니다 1100 해야 있어요 1101

참고 : - dendrapply() 나무에

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)) 

funID<-function(tr,StartID){ 
..... 
attr(n,"ID")= ID # for all the nodes in tr 
} 

무엇이 funID 것 "통계"=를 사용하여

패키지를 모든 노드에 함수를 적용?

+2

적어도 지적으로 재현하여 예를 확인하십시오'당신은 dendograms와'에 사용하는 package' dendrapply' – mnel

+0

@mnel'dendrapply'는 기본 R 함수입니다. 이것은'stats' 패키지에 있습니다. – Andrie

답변

1

이 코드는 stats:::reorder.dendrogram에서 가져온 것이므로 증가하는 정수로 루트 및 각 리프에 레이블을 지정하는 목적에 맞게 수정되었습니다. 그것은 바로 ...

label.leaves <- 
function (x, wts) 
{ N=1 
    if (!inherits(x, "dendrogram")) 
     stop("we require a dendrogram") 
    oV <- function(x, wts) { 
     if (is.leaf(x)) { 
      attr(x, "ID") <- N; N <<- N+1 
      return(x) 
     } 
     k <- length(x) 
     if (k == 0L) 
      stop("invalid (length 0) node in dendrogram") 
     vals <- numeric(k) 
     for (j in 1L:k) { N <- N+1 
      b <- oV(x[[j]], wts) 
      x[[j]] <- b 
      vals[j] <- N; N <- N+1 
     } 
     x 
    } 
    stats:::midcache.dendrogram(oV(x, wts)) 
} 

테스트를 귀하의 사양에 맞게 있지만 않는 경우 표시되지 않을 수 있습니다 :

> Ddend.L <- label.leaves(Ddend) 
> rapply(Ddend.L, function(x) return(attr(x, "ID"))) 
[1] 1 2 3 4 5 6 
관련 문제