[R] Import graph object
Marc Schwartz
marc_schwartz at me.com
Wed Jul 14 22:43:34 CEST 2010
On Jul 14, 2010, at 3: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?
>
> Thanks,
>
> Michael
Read the file in with readLines():
# I am on OSX, so copied from the clipboard
Lines <- readLines(pipe("pbpaste"))
> Lines
[1] "{4, 2, 3}" "{3, 4, 1}" "{4, 2, 1}" "{2, 1, 3}" "{2, 3}"
[6] "{}" "{2, 5, 1}" "{3, 5, 4}" "{3, 4}" "{2, 5, 3}"
# parse the numbers from Lines
L.split <- strsplit(Lines, split = "[{},]")
> L.split
[[1]]
[1] "" "4" " 2" " 3"
[[2]]
[1] "" "3" " 4" " 1"
[[3]]
[1] "" "4" " 2" " 1"
[[4]]
[1] "" "2" " 1" " 3"
[[5]]
[1] "" "2" " 3"
[[6]]
[1] "" ""
[[7]]
[1] "" "2" " 5" " 1"
[[8]]
[1] "" "3" " 5" " 4"
[[9]]
[1] "" "3" " 4"
[[10]]
[1] "" "2" " 5" " 3"
# Create an initial square matrix of 0's
mat <- matrix(0, length(Lines), length(Lines))
> mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 0 0
[4,] 0 0 0 0 0 0 0 0 0 0
[5,] 0 0 0 0 0 0 0 0 0 0
[6,] 0 0 0 0 0 0 0 0 0 0
[7,] 0 0 0 0 0 0 0 0 0 0
[8,] 0 0 0 0 0 0 0 0 0 0
[9,] 0 0 0 0 0 0 0 0 0 0
[10,] 0 0 0 0 0 0 0 0 0 0
# Set the positions in each row to 1
for (i in seq(along = L.split)) mat[i, as.numeric(L.split[[i]])] <- 1
> mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 1 1 1 0 0 0 0 0 0
[2,] 1 0 1 1 0 0 0 0 0 0
[3,] 1 1 0 1 0 0 0 0 0 0
[4,] 1 1 1 0 0 0 0 0 0 0
[5,] 0 1 1 0 0 0 0 0 0 0
[6,] 0 0 0 0 0 0 0 0 0 0
[7,] 1 1 0 0 1 0 0 0 0 0
[8,] 0 0 1 1 1 0 0 0 0 0
[9,] 0 0 1 1 0 0 0 0 0 0
[10,] 0 1 1 0 1 0 0 0 0 0
HTH,
Marc Schwartz
More information about the R-help
mailing list