Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>In case anyone is also interested in dendrogram export, here is my solution. Most probably, it's not the best one as I started using R only recently, but at least it works. So suggestions on how to improve the code are welcome. </p> <p>So, if<code>hr</code>is my hclust object and <code>df</code> is my data, the first column of which contains a simple index starting from 0, and the row names are the names of the clustered items:</p> <pre><code># Retrieve the leaf order (row name and its position within the leaves) leaf.order &lt;- matrix(data=NA, ncol=2, nrow=nrow(df), dimnames=list(c(), c("row.num", "row.name"))) leaf.order[,2] &lt;- hr$labels[hr$order] for (i in 1:nrow(leaf.order)) { leaf.order[which(leaf.order[,2] %in% rownames(df[i,])),1] &lt;- df[i,1] } leaf.order &lt;- as.data.frame(leaf.order) hr.merge &lt;- hr$merge n &lt;- 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]&lt;0) {hr.merge[i] &lt;- abs(hr.merge[i])-1} else { hr.merge[i] &lt;- (hr.merge[i]+n) } } node.id &lt;- c(0:length(hr.merge)) # Generate dendrogram matrix with node index in the first column. dend &lt;- 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] &lt;- 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] &lt;- 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 &lt;- matrix(data=NA, nrow=length(hr$labels), ncol=3, dimnames=list(c(), c("order.number", "leaf.id", "row.name"))) hr.order[,1] &lt;- c(0:(nrow(hr.order)-1)) hr.order[,3] &lt;- t(hr$labels[hr$order]) hr.order &lt;- data.frame(hr.order) hr.order[,1] &lt;- as.numeric(hr.order[,1]) # Assign the row name to each leaf. dend &lt;- as.data.frame(dend) for (i in 1:nrow(df)) { dend[which(dend[,1] %in% df[i,1]),6] &lt;- 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] &lt;- hr.order[i,1]-1 } # Insert height for each node. dend[c((n+2):nrow(dend)),4] &lt;- hr$height # All leaves get the highest possible pruning level dend[which(dend[,1] &lt;= n),3] &lt;- 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] &lt;- dend[(i-1),3]-1} else { dend[i,3] &lt;- dend[(i-1),3] } } dend[,3] &lt;- dend[,3]-min(dend[,3]) dend &lt;- dend[order(-node.id),] # Write results table. write.table(dend, file="path", sep=";", row.names=F) </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload