我在igraph
中有两个网络,我想从第二个网络中的第一个网络中提取所有最短路径的路径序列(而不仅仅是长度)。
其背后的想法是:
我已经将起源目的地数据帧的信息存储在net2
中。
因此,我有旅行的start
和end
节点。我所没有的是start
和end node
之间访问的节点。
我假设代理商将选择shortest_path
进行旅行。
在net
(第一个网络)中,我有一个整个网络,其中的节点和边沿都具有传播时间。
现在,我想看看起源目的地数据帧(net2
)中的代理如何在选择最短路径的同时从起点到终点。
这意味着:我需要结合两个网络。一个具有起点-目的地关系的信息,另一个具有连接节点的顺序。或换句话说:哪些顶点使用net2
中net
中的代理到达其所需节点。
要获得我的网络net
的最短路径序列,我使用了igraph::shortest_paths
。
这给了我一个igraph.vs
对象,其中包含所需的信息。
现在,我想将此信息存储在dataframe
中,但是我不知道如何访问它。
我尝试过:
df<-unlist(shortest_paths(net,from =od$from,to=od$to)
其中od是origin-destination df
现在,我要将multidimensional list
存储为dataframe
。
results <- unlist(df, recursive = F)
results <- sapply(results, as_ids)
result_df <- as.data.frame(matrix(results))
执行此操作时,出现错误:
Error in UseMethod("as_ids") :
no applicable method for 'as_ids' applied to an object of class "c('integer', 'numeric')"
答案 0 :(得分:1)
我不知道这是拼写错误还是您使用的是其他版本,但是我找不到shortest_path()
函数,只有您稍后提到的那个函数:shortest_paths()
。
如果我清楚理解,您想在顶点列表(包含顶点的列表列表)中提取确切的最短路径序列,并将其转换为DF。
这是我的解决方法:
library('igraph')
set.seed(24)
g <- as.undirected(barabasi.game(20, power = 0.5, m = 4))
results <- sapply(V(g), function(x){ all_shortest_paths(g, from = x, to = V(g)[-x])$res})
results <- unlist(results, recursive = F)
results <- sapply(results, as_ids)
result_df <- as.data.frame(matrix(results))
我通过在每个顶点上调用all_short all_shortest_paths
提取了最短路径,其中 from 参数是当前顶点,而 to 参数是其他顶点的列表,减去当前顶点。给定结构仅需要 res 属性。
这给了我一个多维列表:每个节点的顶点列表列表(从给定顶点到每个最短路径)。
...
[[15]]
[[15]][[1]]
+ 3/20 vertices, from 84297ee:
[1] 15 14 1
[[15]][[2]]
+ 3/20 vertices, from 84297ee:
[1] 15 7 1
[[15]][[3]]
+ 3/20 vertices, from 84297ee:
[1] 15 5 1
[[15]][[4]]
+ 3/20 vertices, from 84297ee:
[1] 15 8 2
...
一旦我取消列出其中一层,我便获得了内部顶点列表。这是一个 igraph.vs 结构,您必须使用here中提到的sapply(,as_ids)
函数对其进行转换。
完成此步骤后,您可以进一步处理顶点名称列表的简单列表,converting将它们添加到data.frame
答案 1 :(得分:0)
我将o-d-matrix转换为图形,因为我认为这样做会更快。
我仍然收到错误:Error in UseMethod("as_ids") :
no applicable method for 'as_ids' applied to an object of class "c('integer', 'numeric')"
这可能归因于我的边缘列表类别吗?我有ID为:U1309的顶点?
当我打电话给str(links)
时,它是一个字符。我是否需要转换边缘列表的类别?还是有另一个命令将顶点序列转换为正交向量?