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.

Reply via email to