2012-04-10 39 views
5

Tôi muốn xuất khẩu một chương trình ghi chú từ chương trình vào bảng dữ liệu để sau đó nhập nó vào phần mềm khác ("tự tạo"). str(unclass(fit)) cung cấp tổng quan về văn bản cho dendrogram, nhưng những gì tôi đang tìm kiếm thực sự là một bảng số. Tôi đã xem xét các gói ctc Bioconductor, nhưng đầu ra nó sản xuất trông hơi khó hiểu. Tôi muốn có một cái gì đó tương tự như bảng này: http://stn.spotfire.com/spotfire_client_help/heat/heat_importing_exporting_dendrograms.htm Có cách nào để có được điều này ra khỏi một đối tượng hclust trong R?Xuất dendrogram dưới dạng bảng trong R

Trả lời

1

Có gói thực hiện chính xác đối diện của những gì bạn muốn - Labeltodendro ;-)

Nhưng nghiêm túc, có thể bạn không chỉ cần tự trích xuất các yếu tố từ hclust đối tượng (ví dụ $merge, $height, $order) vaì taûo bảng từ các phần tử được trích xuất?

3

Trong trường hợp bất kỳ ai cũng quan tâm đến việc xuất chương trình dendrogram, đây là giải pháp của tôi. Có lẽ, nó không phải là tốt nhất khi tôi bắt đầu sử dụng R chỉ gần đây, nhưng ít nhất nó hoạt động. Vì vậy, đề xuất về cách cải thiện mã được hoan nghênh.

Vì vậy, nếu hr là đối tượng hclust tôi và df là dữ liệu của tôi, cột đầu tiên trong đó có chứa một chỉ số đơn giản bắt đầu từ 0, và những cái tên hàng là tên của các mặt hàng nhóm:

# 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

tôi chỉ sử dụng mã này và nó hoạt động hoàn hảo. Khó khăn lớn đối với tôi? Đọc hướng dẫn về dữ liệu đầu vào nào được yêu cầu - mô tả của khung dữ liệu "df" thực sự quan trọng, mọi người. – eleanorahowe

+0

@Eleanor Tôi rất vui vì bạn thấy nó hữu ích. Bạn nói đúng, mã dựa trên cấu trúc cụ thể của khung dữ liệu đầu vào. Tôi hy vọng bạn không dành quá nhiều thời gian để tìm ra nó. – AnjaM

Các vấn đề liên quan