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

Messing, Solomon O. SOLOMON.O.MESSING at saic.com
Tue May 13 23:53:44 CEST 2008


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



More information about the R-help mailing list