आर

2012-04-10 9 views
5

में तालिका के रूप में डेंडरोग्राम निर्यात करना मैं इसे बाद में किसी अन्य ("होम-निर्मित") सॉफ़्टवेयर में आयात करने के लिए आर से डेटा तालिका में एक एचक्स्ट-डेंडरोग्राम निर्यात करना चाहता हूं। str(unclass(fit)) डेंडरोग्राम के लिए एक टेक्स्ट अवलोकन प्रदान करता है, लेकिन जो मैं खोज रहा हूं वह वास्तव में एक संख्यात्मक तालिका है। मैंने बायोकॉन्डक्टर सीटीसी पैकेज को देखा है, लेकिन उत्पादन का उत्पादन कुछ हद तक गूढ़ दिखता है। मैं इस तालिका के समान कुछ लेना चाहता हूं: http://stn.spotfire.com/spotfire_client_help/heat/heat_importing_exporting_dendrograms.htm क्या आर में एक हलचल वस्तु से बाहर निकलने का कोई तरीका है? Labeltodendro ;-)आर

लेकिन गंभीरता से, आप बस मैन्युअल रूप से hclust वस्तु से तत्वों को अलग नहीं कर सकते हैं (उदाहरण के लिए $merge, $height, $order) और कस्टम बना सकते हैं -

उत्तर

1

पैकेज के बिल्कुल विपरीत आप क्या चाहते हैं करता है निकाले गए तत्वों से टेबल?

3

यदि कोई भी डेंडरोग्राम निर्यात में रूचि रखता है, तो मेरा समाधान यहां है। सबसे अधिक संभावना है, यह सबसे अच्छा नहीं है क्योंकि मैंने हाल ही में आर का उपयोग शुरू किया था, लेकिन कम से कम यह काम करता है। तो कोड को सुधारने के सुझावों का स्वागत है।

तो, अगर 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

मैं बस इस कोड का इस्तेमाल किया और यह पूरी तरह से काम किया। मेरे लिए बड़ी कठिनाई? इनपुट डेटा की आवश्यकता के बारे में दिशानिर्देश पढ़ना - डेटा फ्रेम "डीएफ" का विवरण वास्तव में महत्वपूर्ण है, दोस्तों। – eleanorahowe

+0

@ एलनॉर मुझे खुशी है कि आपको यह उपयोगी लगता है। आप सही हैं, कोड इनपुट डेटा फ्रेम की एक विशेष संरचना पर निर्भर करता है। मुझे उम्मीद है कि आपने इसे समझने में बहुत अधिक समय नहीं लगाया है। – AnjaM