Search code examples
rfor-loopigraph

Use a for loop as many times as the length of a list of igraph.vs objects to create dataframes with the names they include


I have the nodes and edges dataframes below and then I create a graph object gph. After that I create an list of igraph.vs objects named asp with all simple paths. Then I want to be able to use a for loop in order to create as many dataframes as the length of the list with the names of each igraph.vs object.

name<-c("Robert Zero",       "Amy Adams",         "Barry Beane",       "Henry Handler",     "Julie Jones",      
       "Charlie Cheese",    "Karen Klein",       "Lolly Landswright", "Imogene Isler",     "David Dufresne",   
       "Frank Flaherty",    "Egbert English",    "George Graham",     "Molly McKee",       "Norman Needle",    
       "Oscar Oliver",      "Peter Platteville", "Quincy Quebec",     "Roger Rabbit",      "Steve Sweet",      
       "Tom Thompson",      "Victor Valentino",  "Ulrich Uxbridge" )
label<-c("Robert Zero",       "Amy Adams",         "Barry Beane",       "Henry Handler",     "Julie Jones",      
         "Charlie Cheese",    "Karen Klein",       "Lolly Landswright", "Imogene Isler",     "David Dufresne",   
         "Frank Flaherty",    "Egbert English",    "George Graham",     "Molly McKee",       "Norman Needle",    
         "Oscar Oliver",      "Peter Platteville", "Quincy Quebec",     "Roger Rabbit",      "Steve Sweet",      
         "Tom Thompson",      "Victor Valentino",  "Ulrich Uxbridge" )
nodes<-data.frame(name,label)


from<-c("Robert Zero",       "Amy Adams",         "Barry Beane",       "Barry Beane",       "Barry Beane",      
         "Julie Jones",       "Karen Klein",       "Imogene Isler",     "David Dufresne",    "Frank Flaherty",   
         "Egbert English",    "George Graham",     "Molly McKee",       "Molly McKee",       "Amy Adams",        
         "Peter Platteville", "Amy Adams",         "Roger Rabbit",      "Julie Jones",       "Robert Zero",      
         "Steve Sweet",       "Tom Thompson",      "Steve Sweet",       "Ulrich Uxbridge",   "Henry Handler",    
         "Barry Beane",       "Barry Beane",       "Charlie Cheese",    "Barry Beane",       "Victor Valentino", 
         "Tom Thompson"     )
to<-c( "Amy Adams",         "Barry Beane",       "Henry Handler",     "Julie Jones",       "Charlie Cheese",   
       "Karen Klein",       "Lolly Landswright", "Robert Zero",       "Frank Flaherty",    "Robert Zero",      
       "George Graham",     "Robert Zero",       "Norman Needle",     "Julie Jones",       "Oscar Oliver",     
       "Robert Zero",       "Quincy Quebec",     "Robert Zero",       "Molly McKee",       "Steve Sweet",      
       "Tom Thompson",      "Victor Valentino",  "Ulrich Uxbridge",   "Barry Beane",       "Robert Zero",      
       "Imogene Isler",     "Peter Platteville", "Robert Zero",       "Roger Rabbit",      "Robert Zero",      
       "Roger Rabbit"   )

edges<-data.frame(from,to)


#Combine them in order to create the graph object
library(igraph)
gph <- graph_from_data_frame(edges, directed=TRUE, vertices=nodes)

#Create the simple paths asp 
asp <- all_simple_paths(gph, "Steve Sweet", "Robert Zero")

anodes<-data.frame()
for(i in 1 :length(asp)){
  anodes[i]<-data.frame(names(asp[[i]]))
  colnames(anodes)<-"id"
  anodes$label<-nodes$id
}

Example of 1st result

id        label
1  Steve Sweet  Steve Sweet
2 Tom Thompson Tom Thompson
3 Roger Rabbit Roger Rabbit
4  Robert Zero  Robert Zero

Solution

  • Do you mean something like this?

    lapply(
      asp,
      function(p) {
        data.frame(
          id = seq_along(p),
          label = p$label
        )
      }
    )
    

    such that

    [[1]]
      id        label
    1  1  Steve Sweet
    2  2 Tom Thompson
    3  3 Roger Rabbit
    4  4  Robert Zero
    
    [[2]]
      id            label
    1  1      Steve Sweet
    2  2     Tom Thompson
    3  3 Victor Valentino
    4  4      Robert Zero
    
    [[3]]
      id           label
    1  1     Steve Sweet
    2  2 Ulrich Uxbridge
    3  3     Barry Beane
    4  4   Henry Handler
    5  5     Robert Zero
    
    [[4]]
      id           label
    1  1     Steve Sweet
    2  2 Ulrich Uxbridge
    3  3     Barry Beane
    4  4  Charlie Cheese
    5  5     Robert Zero
    
    [[5]]
      id           label
    1  1     Steve Sweet
    2  2 Ulrich Uxbridge
    3  3     Barry Beane
    4  4   Imogene Isler
    5  5     Robert Zero
    
    [[6]]
      id             label
    1  1       Steve Sweet
    2  2   Ulrich Uxbridge
    3  3       Barry Beane
    4  4 Peter Platteville
    5  5       Robert Zero
    
    [[7]]
      id           label
    1  1     Steve Sweet
    2  2 Ulrich Uxbridge
    3  3     Barry Beane
    4  4    Roger Rabbit
    5  5     Robert Zero