igraph-help
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [igraph] R : Loop contract.vertices to calculate network measures fo


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

You could use either a 'for' loop or the '*apply' family. You can also use lists for your variables for indexing, e.g.

for (i in 1:NumGroups) {
  subv.group[[i]] <- c(as.numeric(as.vector(subv[i, ])))

etc.
etc.
}

Do something similar with the other variables. I don't know how fast/slow this will be. I'm sure it can be optimized.

Not sure why you have "c" with "as.numeric" and "as.vector"; the "c" should be unnecessary I think. Also, why convert "subv1" to type character?

On Tue, Dec 16, 2014 at 1:45 PM, Dimitri Marschall <address@hidden> wrote:
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

reply via email to

[Prev in Thread] Current Thread [Next in Thread]