Finding root vertices in largeish dataset in igraph on R

前端 未结 2 606
一整个雨季
一整个雨季 2021-01-16 12:10

Suppose you have an graph that you\'ve made from an edgelist, and there are a couple hundred vertices. What I\'m looking to do is to identify the initial set of vertices fro

相关标签:
2条回答
  • 2021-01-16 12:30

    For any node, n, you can find the number of edges into the node using neighbors(g, n, mode="in"). A node is an initial vertex if it does not have any edges coming into it. So you can just test all of the nodes for how many edges enter the node and select those for which the answer is zero.

    Here is a simple example graph:

    library(igraph)
    set.seed(2017)
    g = erdos.renyi.game(12, 20, type="gnm", directed=TRUE)
    plot(g)
    

    Now we can find the root nodes.

    which(sapply(sapply(V(g), 
        function(x) neighbors(g,x, mode="in")), length) == 0)
    [1] 1 2
    

    This says that nodes 1 and 2 are sources.

    Since you say that you are a beginner, let me explain this just a little.

    function(x) neighbors(g,x, mode="in") is a function that takes a node as an argument and uses neighbors to return a list of nodes y that have a link from y to x (the parents of x).

    sapply(V(g), function(x) neighbors(g,x, mode="in")) applies that function to all of the nodes in the graph, and so gives a list of the parents for every node. We are interested in the nodes that have no parents so we want the nodes for which the length of this list is zero. Thus, we apply length to the list of parents and check which lengths are zero.

    0 讨论(0)
  • 2021-01-16 12:33

    enter code hereThe solution of G5W fails if the graph contains a self-loop. An alternative approach:

    library(igraph)
    set.seed(2017)
    g = erdos.renyi.game(12, 20, type="gnm", directed=TRUE)
    rts <- V(g)[degree(g, mode=c("in"), loops = F) == 0]        # find roots, that is, in-degree is zero
    paste(c("Roots: ", rts), collapse=" ")
    plot(g, layout=layout_with_sugiyama(g)$layout)              # plot graph in layers
    
    g2 <- simplify(g, remove.loops = T, remove.multiple = T)    # reduce to simple graph without loops
    stopifnot(max(clusters(g2, mode=c("strong"))$csize) == 1)   # stop when cycles
    
    E(g2)$weight <- -1                                          # shortest path is longest negative
    dis <- (-distances(g2, mode="in") )                         # matrix VxV of depth of layers, depth from top to bottom
    lay = as.matrix(apply(dis, 1, max))                         # maximum of distances in successors
    as.matrix(apply(-distances(g2, mode="out"), 1, max))        # or reverse from bottom to top
    
    plot(g, layout=layout_with_sugiyama(g, layer=lay)$layout)
    
    0 讨论(0)
提交回复
热议问题