Hi Gabor, Thank you for your help, and thanks for making the excellent igraph package. The function below seems not generate an edge list that works for my data. I coerced a my data from a data frame using graph.data.frame.
You asked in your previous post if 2-mode networks are bipartite. I believe the answer is yes. However, in Hanneman, Robert A. and Mark Riddle. 2005. Introduction to social network methods. Riverside, CA: University of California, Riverside ( published in digital form at http://faculty.ucr.edu/~hanneman/ ) I found the following: "Two-mode data are sometimes stored in a second way, called the "bipartite" matrix. A bipartite matrix is formed by adding the rows as additional columns, and columns as additional rows." Did I need to convert my data frame to a bipartite matrix before applying the two.to.one function? Solomon >-----Original Message----- >From: Gabor Csardi [mailto:[EMAIL PROTECTED] >Sent: Saturday, May 10, 2008 1:09 PM >To: Messing, Solomon O. >Cc: r-help@r-project.org >Subject: Re: [R] For Social Network Analysis-Graph Analysis - How to convert 2 >mode data to 1 mode data? > >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@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 <[EMAIL PROTECTED]> UNIL DGM ______________________________________________ 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.