|
From: | Chris Watson |
Subject: | Re: [igraph] R : Loop contract.vertices to calculate network measures for groups in a social network in Igraph |
Date: | Tue, 16 Dec 2014 14:04:27 -0500 |
Hi,
I am trying to calculate different networks measures such as `betweenness()` and `constraint()`in my network using Igraph in R. My problem is that I am not looking at individuals but on groups of individuals in my network. Therefore I have to contract the vertices before I calculate the different network measures. Thus far I have been able to create a basic code to calculate the measures. But I have a total of ca. 900 groups (with up to 7 members per group) in a network of ca. 70.000 nodes and 250.000 edges. So I am trying to create a loop to automate the approach and make life a little bit easier.
Now I want to present my approach to calculate the `constrain()`.
# load package
library(igraph)
# load data and create a weighted edgelist
df <- data.frame(from=c(6, 9, 10, 1, 7, 8, 8, 4, 5, 2, 5, 10), to=c(3, 4, 2, 5, 10, 1, 9, 10, 6, 9, 3, 6), weight=c(4, 2, 1, 2, 3, 3, 1, 1, 4, 5, 2, 2))
g <- graph.data.frame(df, directed =FALSE)
#import groups
groups <- "
1 5 8
2
10 7 "
subv <- read.table(text = groups, fill = TRUE, header = FALSE)
I would like to loop the upcoming code , to calculate not each `constraint()` separately. But for all the three groups given in the reproducible example at once.
#create a subvector of the first group and delete all the NA entries
subv1 <- c(as.numeric(as.vector(subv[1,])))
subv1 <- subv1[!is.na(subv1)]
#save subvector as charcter
subv1 <- as.character(subv1)
#creat subgraph with the nodes of group 1 from graph and add their 1st neighbors
g2 <- induced.subgraph(graph=g ,vids=unlist(neighborhood(graph=g ,order=1, nodes = subv1)))
#identify the igraph IDs of the nodes in the first group
match("1", V(g2)$name)
match("5", V(g2)$name)
match("8", V(g2)$name)
#create a contract vector and contract the vertices from largest to smallest using the output from match
convec1 <- c(1:(5-1), 3, 5:(vcount(g2)-1))
g3 <- contract.vertices(g2, convec1, vertex.attr.comb=toString)
convec2 <- c(1:(4-1), 3, 4:(vcount(g3)-1))
g4 <- contract.vertices(g3, convec2, vertex.attr.comb=toString)
#remove the selfloops and sum the weight attributes for the created graph
g5 <- simplify(g4, remove.loops = TRUE, edge.attr.comb=list(weight="sum"))
# calculate the constraint measure for the vertex 1, 5, 8
constraint(g5, nodes=3, weights=NULL)
So now I have the constraint measure for the first group. For the second and third I would have to repeat my steps again. This would be feasible, but as I stated I have 900 groups. Is there any possibility to loop this?
Kind regards,
D.A.M.
_______________________________________________
igraph-help mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/igraph-help
[Prev in Thread] | Current Thread | [Next in Thread] |