Superb. It works. The results loo great. I just tweaked the function a little bit to suit my needs though. I passed merges and vcount separately as fgc$merges and vcount(g). The vcount attribute was not there in fgc object. Also, I removed the last row from the merges matrix before returning as it was adding the very root level undesired by the heatmap.2 function I was using. The final function looks like this:
# To generate a complete dendogram from disconnected subgraphs in merges given by fgc complete.dend <- function(merges, vcount) { if (nrow(merges) < vcount-1) { miss <- seq_len(vcount + nrow(merges))[-as.vector(merges)] miss <- c(miss, seq_len(length(miss)-2) + vcount+nrow(merges)) miss <- matrix(miss, byrow=TRUE, ncol=2) merges <- rbind(merges, miss) } storage.mode(merges) <- "integer" merges[-nrow(merges),] # skip last row } Thank you so much Gabor for this custom complete.dend fucntion. I couldn't find it in the regular igraph library (http://igraph.sourceforge.net/doc/R/00Index.html). Best, Fayez ________________________________________ From: csardi.ga...@gmail.com [csardi.ga...@gmail.com] on behalf of Gábor Csárdi [csa...@rmki.kfki.hu] Sent: Monday, June 04, 2012 6:33 PM To: Aziz, Muhammad Fayez Cc: r-help@r-project.org; Caetano-Anolles, Gustavo Subject: Re: [R] community finding in a graph and heatplot On Sun, Jun 3, 2012 at 4:11 PM, Aziz, Muhammad Fayez <az...@illinois.edu> wrote: > > Hmm interesting. To come to think of it there could be many disconnected > components in the graph and thus there should be a generic way to either > mitigate the disconnectedness in the dendrogram or in the original graph. I > had no luck in finding such a trick though google search. I then ran the > script on minute-scale graphs and have following results: > > 1) disconnected graph with three modules: > > *Vertices 9 > *Edges > 1 2 1 > 2 3 1 > 3 1 1 > 4 5 1 > 5 6 1 > 6 4 1 > 7 8 1 > 8 9 1 > 9 7 1 > > corresponding fgc$merges matrix: > > [,1] [,2] > [1,] 1 0 > [2,] 2 9 > [3,] 7 6 > [4,] 8 11 > [5,] 4 3 > [6,] 5 13 > > 2) connected graph by adding links 1-2 and 4-7 in graph 1): > > *Vertices 9 > *Edges > 1 2 1 > 2 3 1 > 3 1 1 > 4 5 1 > 5 6 1 > 6 4 1 > 7 8 1 > 8 9 1 > 9 7 1 > 1 4 1 > 4 7 1 > > corresponding fgc$merges matrix: > > [,1] [,2] > [1,] 2 1 > [2,] 0 9 > [3,] 8 7 > [4,] 6 11 > [5,] 5 4 > [6,] 3 13 > [7,] 14 12 > [8,] 15 10 > > There needs to be a generic way to get fgc$merges of the form 2) from 1). > Hints please. Well, how do you merge the unconnected components? I guess you could come up with an order based on modularity, or just merge them in arbitrary order. The following is from igraph 0.6, and I haven't tried it on your data, but it might just work. It merges the individual subtrees in arbitrary order. complete.dend <- function(comm) { merges <- comm$merges if (nrow(merges) < comm$vcount-1) { miss <- seq_len(comm$vcount + nrow(merges))[-as.vector(merges)] miss <- c(miss, seq_len(length(miss)-2) + comm$vcount+nrow(merges)) miss <- matrix(miss, byrow=TRUE, ncol=2) merges <- rbind(merges, miss) } storage.mode(merges) <- "integer" merges } Best, Gabor [...] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.