[R] For Social Network Analysis-Graph Analysis - How to convert 2 mode data to 1 mode data?

Gabor Csardi csardi at rmki.kfki.hu
Sat May 10 19:09:22 CEST 2008


Solomon, if i understand two-mode networks properly (they're bipartite, right?),
then this is not hard to do with igraph. Basically, for each vertex create an 
order=2 neighborhood, and then create a graph from the adjacency list,
it is something like this:

two.to.one <- function(g, keep) {
  neis <- neighborhood(g, order=2)
  neis <- lapply(seq(neis), function(x) neis[[x]][ neis[[x]] != x-1]) ## drop self-loops
  neis <- lapply(neis, function(x) x[ x %in% keep ])                  ## keep only these
  neis <- lapply(seq(neis), function(x) t(cbind(x-1, neis[[x]])))     ## create edge lists
  neis[-keep-1] <- NULL                                               ## these are not needed
  neis <- matrix(unlist(neis), byrow=TRUE, nc=2)                      ## a single edge list
  neis <- neis[ neis[,1] > neis[,2], ]                                ## count an edge once only
  mode(neis) <- "character"
  g2 <- graph.edgelist(neis, dir=FALSE)
  V(g2)$id <- V(g2)$name                                              ## 'id' is used in Pajek
  g2
}

It does not check that the graph is indeed two-mode, and it keeps the 
vertices given in the 'keep' argument. 'keep' is made of igraph vertex ids.
You can use it like this:

g <- graph.ring(10)
keep <- seq(0,8,by=2) ## we keep the 'even' vertices

g2 <- two.to.one(g, keep)
write.graph(two.to.one(g, keep), format="pajek", file="/tmp/a.net")

I haven't tested it much. We'll have a better function in the next igraph version.
Gabor

On Fri, May 09, 2008 at 03:37:05PM -0400, Messing, Solomon O. wrote:
> Hi,
> 
>  
> 
> Does anyone know of a package in R that has a function to convert
> network data (e.g. an adjacency matrix or ) from 2-mode to 1-mode?  I am
> conducting social network analysis.  I know that Pajek has this function
> under Net --> Transform --> 2-mode to 1-mode --> Rows.  I have searched
> the documentation under packages 'sna', 'network', 'igraph', and
> 'dynamicgraph' but I was not able to identify a comparable function.  
> 
>  
> 
> I would just export my data to Pajek and import it to R, but I'm going
> to have to generate hundreds of these graphs, so it would take quite a
> bit of time to do it this way.  
> 
>  
> 
> Thanks,
> 
>  
> 
> Solomon
> 
>  
> 
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at 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.

-- 
Csardi Gabor <csardi at rmki.kfki.hu>    UNIL DGM



More information about the R-help mailing list