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 ______________________________________________ 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.