2012-04-10 2 views
5

R에서 데이터 테이블로 hclust-dendrogram을 내 보내어 나중에 다른 소프트웨어 ("자체 제작")로 가져 오려고합니다. str(unclass(fit))은 dendrogram에 대한 텍스트 개요를 제공하지만 내가 찾고있는 것은 실제로 숫자 표입니다. Bioconductor ctc 패키지를 살펴 보았지만 출력물이 다소 이상하게 보입니다. 이 테이블과 비슷한 것을 갖고 싶습니다 : http://stn.spotfire.com/spotfire_client_help/heat/heat_importing_exporting_dendrograms.htm R의 hclust 오브젝트에서 이것을 가져 오는 방법이 있습니까? Labeltodendro ;-)dendrogram을 테이블로 내보내기 R

를하지만 심각, 당신은 단지 수동으로 hclust 개체의 요소를 추출 할 수 없습니다 (예를 들어 $merge, $height, $order) 및 사용자 정의를 생성 -

답변

1

당신이 원하는 것을 정확히 반대하지 패키지가있다 추출 된 요소의 테이블?

3

누구나 dendrogram export에도 관심이있는 경우, 여기 내 해결책이 있습니다. 아마 최근에 R을 사용하기 시작했을 때 가장 좋은 것은 아니지만 적어도 작동합니다. 코드를 개선하는 방법에 대한 제안은 환영합니다. hr 내 hclust 객체이며, 경우

그래서, df는 0에서 시작하는 간단한 인덱스를 포함하는 첫 번째 열에있는 내 데이터는, 그리고 행 이름은 클러스터 항목의 이름입니다 :

# Retrieve the leaf order (row name and its position within the leaves) 
leaf.order <- matrix(data=NA, ncol=2, nrow=nrow(df), 
       dimnames=list(c(), c("row.num", "row.name"))) 
leaf.order[,2] <- hr$labels[hr$order] 
for (i in 1:nrow(leaf.order)) { 
    leaf.order[which(leaf.order[,2] %in% rownames(df[i,])),1] <- df[i,1] 
} 
leaf.order <- as.data.frame(leaf.order) 

hr.merge <- hr$merge 
n <- max(df[,1]) 

# Re-index all clustered leaves and nodes. First, all leaves are indexed starting from 0. 
# Next, all nodes are indexed starting from max. index leave + 1. 
for (i in 1:length(hr.merge)) { 
    if (hr.merge[i]<0) {hr.merge[i] <- abs(hr.merge[i])-1} 
    else { hr.merge[i] <- (hr.merge[i]+n) } 
} 
node.id <- c(0:length(hr.merge)) 

# Generate dendrogram matrix with node index in the first column. 
dend <- matrix(data=NA, nrow=length(node.id), ncol=6, 
      dimnames=list(c(0:(length(node.id)-1)), 
       c("node.id", "parent.id", "pruning.level", 
       "height", "leaf.order", "row.name"))) 
dend[,1] <- c(0:((2*nrow(df))-2)) # Insert a leaf/node index 

# Calculate parent ID for each leaf/node: 
# 1) For each leaf/node index, find the corresponding row number within the merge-table. 
# 2) Add the maximum leaf index to the row number as indexing the nodes starts after indexing all the leaves. 
for (i in 1:(nrow(dend)-1)) { 
    dend[i,2] <- row(hr.merge)[which(hr.merge %in% dend[i,1])]+n 
} 

# Generate table with indexing of all leaves (1st column) and inserting the corresponding row names into the 3rd column. 
hr.order <- matrix(data=NA, 
      nrow=length(hr$labels), ncol=3, 
      dimnames=list(c(), c("order.number", "leaf.id", "row.name"))) 
hr.order[,1] <- c(0:(nrow(hr.order)-1)) 
hr.order[,3] <- t(hr$labels[hr$order]) 
hr.order <- data.frame(hr.order) 
hr.order[,1] <- as.numeric(hr.order[,1]) 

# Assign the row name to each leaf. 
dend <- as.data.frame(dend) 
for (i in 1:nrow(df)) { 
     dend[which(dend[,1] %in% df[i,1]),6] <- rownames(df[i,]) 
} 

# Assign the position on the dendrogram (from left to right) to each leaf. 
for (i in 1:nrow(hr.order)) { 
     dend[which(dend[,6] %in% hr.order[i,3]),5] <- hr.order[i,1]-1 
} 

# Insert height for each node. 
dend[c((n+2):nrow(dend)),4] <- hr$height 

# All leaves get the highest possible pruning level 
dend[which(dend[,1] <= n),3] <- nrow(hr.merge) 

# The nodes get a decreasing index starting from the pruning level of the 
# leaves minus 1 and up to 0 

for (i in (n+2):nrow(dend)) { 
    if ((dend[i,4] != dend[(i-1),4]) || is.na(dend[(i-1),4])){ 
     dend[i,3] <- dend[(i-1),3]-1} 
     else { dend[i,3] <- dend[(i-1),3] } 
} 
dend[,3] <- dend[,3]-min(dend[,3]) 

dend <- dend[order(-node.id),] 

# Write results table. 
write.table(dend, file="path", sep=";", row.names=F) 
+0

I 방금이 코드를 사용했고 완벽하게 작동했습니다. 나를위한 큰 어려움? 입력 데이터가 필요한지에 대한 지침을 읽었습니다. 데이터 프레임 "df"에 대한 설명이 실제로 중요합니다. – eleanorahowe

+0

@ Eleanor 당신이 유용하다는 것을 알게되어서 기쁩니다. 맞습니다. 코드는 입력 데이터 프레임의 특정 구조에 의존합니다. 나는 당신이 그것을 알아 내기에 너무 많은 시간을 소비하지 않았기를 바랍니다. – AnjaM

관련 문제