How to calculate the edge attributes as the path length in igraph?

447 Views Asked by At

Pretend the dataframe below is an edgelist (relation between inst2 and motherinst2), and that km is an attribute I want to calculate as a path that's been assigned to the edges. I'm too new at coding to make a reproducible edge list.

inst2 = c(2, 3, 4, 5, 6) 
motherinst2 = c(7, 8, 9, 10, 11) 
km = c(20, 30, 40, 25, 60)
df2 = data.frame(inst2, motherinst2)
edgelist = cbind(df2, km)
g = graph_from_data_frame(edgelist)

I know how to calculate the path length of vertices in a graph, but I have some attributes attached to the edges that I want to sum up as path lengths. They are simple attributes (distance in km, time in days, and speed as km/day).

This is how I was calculating the path of vertices (between roots and terminals/leaves):

roots = which(sapply(sapply(V(g),
                    function(x) neighbors(g, x, mode = 'in')), length) == 0)

#slight tweaking this piece of code will also calculate 'terminal' nodes (or leaves). (11):

terminals = which(sapply(sapply(V(g),
                    function(x) neighbors(g, x, mode = 'out')), length) == 0)


paths= lapply(roots, function(x) get.all.shortest.paths(g, from = x, to = terminals, mode = "out")$res)

named_paths= lapply(unlist(paths, recursive=FALSE), function(x) V(g)[x])

I just want to do essentially exactly as I did above, but summing up the distance, time, and rate (which I will compute the mean of) incurred between each of those paths. If it helps to know how the edges have been added as attributes, I've used cbind like so:

edgelist_df = cbind(edgelist_df, time, dist, speed)

and my graph object (g) is set up like this:

g <- graph_from_data_frame(edgelist_df, vertices = vattrib_df) 

vattrib_df is the attributes of the vertices, which is not of interest to us here.

0

There are 0 best solutions below