[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [igraph] Generating a clustered graph

From: Tamas Nepusz
Subject: Re: [igraph] Generating a clustered graph
Date: Wed, 10 Aug 2011 13:10:50 +0200
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv: Gecko/20110617 Lightning/1.0b2 Thunderbird/3.1.11

> I'm a newbie with R. Can you give a hint on how can I do it?
I'm a newbie as well because I usually work with the Python interface, but
here's a very crude solution that nevertheless works unless you have
thousands of clusters.

First, let's store the number of clusters:

num.clusters <- max(membership)

We then iterate over the edge list of the graph and check which clusters the
endpoints belong to:

edgelist <- get.edgelist(graph)
endpoints <- matrix(membership[edgelist], ncol=2, byrow=T)
edgelist <- get.edgelist(graph)

Then let's create a square matrix which will store the adjacency matrix of
our meta-graph:

adj <- mat.or.vec(num.clusters, num.clusters)
adj[endpoints] <- 1

Finally we create the meta-graph (clearing the diagonal of adj so we don't
have loop edges for each cluster):

cluster.graph <- graph.adjacency(cluster.graph, mode="undirected", diag=F)

Note that the above code is for igraph 0.6, which uses 1-based indexing
everywhere. If you use igraph 0.5.4 (which is very likely), you may have to
add 1 to some of the indices to make it work. Most likely you'll need this:

membership <- membership + 1
edgelist <- get.edgelist(graph) + 1

Also, the above code does not give weights for the edges in the meta-graph.
If you want to assign weights to the edges that specify how many edges go
between clusters in the original graph, you can do it as follows:

adj <- mat.or.vec(num.clusters, num.clusters)
for (i in 1:ecount(graph)) {
    adj[endpoints[i,1], endpoints[i,2]] <- adj[endpoints[i,1],
endpoints[i,2]] + 1

I'm sure there's an easier and more efficient way of doing the above
calculation in R but I'm not that familiar with R and this is the best I
managed to get.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]