For Social Network Analysis-Graph Analysis - How to convert 2 mode data to 1 mode data?
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:csardi at rmki.kfki.hu] Sent: Saturday, May 10, 2008 1:09 PM To: Messing, Solomon O. Cc: r-help at 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 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