With some help, I figured out how to transform an edgelist, aka, an adjacency list into an adjacency matrix. I want to learn how to automate this for a large number of edgelists and then put the resulting adjacency matrices in a list.
I’m guessing plyr is the best way to do this, but if you want to tell me how to do it with loops I’d be grateful for that as well. For the curious, the data represents social networks in different schools.
Here’s what I’ve got so far:
# extract one school edgelist from the dataframe
aSchool <- myDF[which(myDF$school==1), c("school", "id", "x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")]
# figure out unique ids
edgeColumns <- c("x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")
ids <- unique(unlist(aSchool[edgeColumns]))
ids <- ids[!is.na(ids)]
# make an empty matrix
m <- matrix(0,nrow=length(ids),ncol=length(ids))
rownames(m) <- colnames(m) <- as.character(ids)
# fill in the matrix
for(col in edgeColumns){
theseEdges <- aSchool[c("id",col)]
theseEdges <- na.omit(theseEdges)
theseEdges <- apply(theseEdges,1,as.character)
theseEdges <- t(theseEdges)
m[theseEdges] <- m[theseEdges] + 1
}
for(i in 1:nrow(m)) m[i,i] <- 0
Check out the SNA package and the
as.edgelist.sna()andas.sociomatrix.sna()functions.In particular,
as.sociomatrix.sna()seems like the perfect solution here: it’s designed to convert an edgelist to an adjacency matrix in a single step (without losing attributes such as vertex names, etc.). Wrap it all up in a call tolapply()and I think you’ve got yourself yet another (maybe less labor intensive?) solution.If you’d like to see a more expressive answer, I think it would be helpful to either provide more complete sample data or a clearer description of exactly what is in
myDFAlso, I don’t have the reputation on SO to do so, but I would add some tags to this post to signal that it’s about network analysis.