[R] Import graph object

Duncan Murdoch murdoch.duncan at gmail.com
Wed Jul 14 22:40:53 CEST 2010


On 14/07/2010 4:19 PM, Michael Haenlein wrote:
> Dear all,
> 
> I have a txt file of the following format that describes the relationships
> between a network of a certain number of nodes.
> 
> {4, 2, 3}
> {3, 4, 1}
> {4, 2, 1}
> {2, 1, 3}
> {2, 3}
> {}
> {2, 5, 1}
> {3, 5, 4}
> {3, 4}
> {2, 5, 3}
> 
> For example the first line {4, 2, 3} implies that there is a connection
> between Node 1 and Node 4, a connection between Node 1 and Node 2 and a
> connection between Node 1 and Node 3. The second line {3, 4, 1} implies that
> there is a connection between Node 2 and Node 3 as well as Node 4 and Node
> 1. Note that some of the nodes can be isolated (i.e., not have any
> connections to any other node) which is then indicated by {}. Also note that
> the elements in each row are not necessarily ordered (i.e., {4, 2, 3}
> instead of {2, 3, 4}). I would like to (a) read the txt file into R and (b)
> convert it to an adjacency matrix. For example the adjacency matrix
> corresponding to the aforementioned example is as follows:
> 
> 0 1 1 1 0 0 0 0 0 0
> 1 0 1 1 0 0 0 0 0 0
> 1 1 0 1 0 0 0 0 0 0
> 1 1 1 0 0 0 0 0 0 0
> 0 1 1 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0
> 1 1 0 0 1 0 0 0 0 0
> 0 0 1 1 1 0 0 0 0 0
> 0 0 1 1 0 0 0 0 0 0
> 0 1 1 0 1 0 0 0 0 0
> 
> Is there any convenient way of doing this?

It'll take a little work, but the general strategy is this:

Use readLines to read the whole file, putting each line into one element 
of a character vector.

Use a loop of some sort to proceed through the vector.  Strip off the 
braces, use scan() to read the numbers, use the numbers to set the 1's 
in the adjacency matrix.  For example (untested):

x <- readLines( .. )
M <- matrix(0, length(x), length(x))
for (i in seq_along(x)) {
   y <- gsub("[{},]", " ", x[i])
   entries <- scan(textConnection(y))
   M[i, entries] <- 1
}

This leaves a bunch of textConnections open so you could clean up by 
calling closeAllConnections (or close each one), but other than that it 
should work.

Duncan Murdoch



More information about the R-help mailing list