在R上的igraph中查找largeish数据集中的根顶点

在R上的igraph中查找largeish数据集中的根顶点,r,root,igraph,vertex,R,Root,Igraph,Vertex,假设你有一个由边列表生成的图,有几百个顶点。我想做的是确定初始顶点集,所有后续顶点都与之相关,比如母亲或族谱 这是一个代表“冰岛”的数据集,冰岛是从冰川上脱落并漂浮在海面上的大型表格状冰。初始断裂表示根节点。后续顶点是对这些片段的重新观察,这些片段要么是较小的熔化岛,要么是已断开的片段,因此源顶点具有两条边的网络,并继续形成两个新顶点 有没有一段代码或一个函数可以为我轻松地做到这一点?如果我在绘图中添加标签,则无法读取。我能找到的大多数操作根节点的方法都涉及小样本数据集,在这些数据集中,您可以任

假设你有一个由边列表生成的图,有几百个顶点。我想做的是确定初始顶点集,所有后续顶点都与之相关,比如母亲或族谱

这是一个代表“冰岛”的数据集,冰岛是从冰川上脱落并漂浮在海面上的大型表格状冰。初始断裂表示根节点。后续顶点是对这些片段的重新观察,这些片段要么是较小的熔化岛,要么是已断开的片段,因此源顶点具有两条边的网络,并继续形成两个新顶点

有没有一段代码或一个函数可以为我轻松地做到这一点?如果我在绘图中添加标签,则无法读取。我能找到的大多数操作根节点的方法都涉及小样本数据集,在这些数据集中,您可以任意命名图形中的对象,或者使用顶点的实际名称。我的数据来自一个巨大的CSV,上面有超长的数字字符名。这使它变得困难

我也是一个超级新的编码和R是一个噩梦,我使用。请温柔地使用简单的例子!如果你认为有帮助的话,我可以附上我的代码,我的所有数据都是从服务器中提取出来的,我不知道从你的角度来看,它是否会非常清晰


谢谢。

对于任何节点n,您可以使用 邻居G,n,模式=in。如果没有任何边进入节点,则节点是初始顶点。因此,您可以测试所有节点中有多少条边进入节点,然后选择答案为零的边

下面是一个简单的示例图:

library(igraph)
set.seed(2017)
g = erdos.renyi.game(12, 20, type="gnm", directed=TRUE)
plot(g)
现在我们可以找到根节点了

which(sapply(sapply(V(g), 
    function(x) neighbors(g,x, mode="in")), length) == 0)
[1] 1 2
这表示节点1和2是源

既然你说你是初学者,让我解释一下

functionx neighborsg,x,mode=in是一个函数,它将一个节点作为参数,并使用邻居返回一个节点列表y,该列表y具有从y到x的父节点x的链接


sapplyVg,functionx neighborsg,x,mode=in将该函数应用于图中的所有节点,并给出每个节点的父节点列表。我们感兴趣的是没有父节点的节点,所以我们想要列表长度为零的节点。因此,我们将长度应用于父列表,并检查哪些长度为零

对于任何节点n,可以使用 邻居G,n,模式=in。如果没有任何边进入节点,则节点是初始顶点。因此,您可以测试所有节点中有多少条边进入节点,然后选择答案为零的边

下面是一个简单的示例图:

library(igraph)
set.seed(2017)
g = erdos.renyi.game(12, 20, type="gnm", directed=TRUE)
plot(g)
现在我们可以找到根节点了

which(sapply(sapply(V(g), 
    function(x) neighbors(g,x, mode="in")), length) == 0)
[1] 1 2
这表示节点1和2是源

既然你说你是初学者,让我解释一下

functionx neighborsg,x,mode=in是一个函数,它将一个节点作为参数,并使用邻居返回一个节点列表y,该列表y具有从y到x的父节点x的链接


sapplyVg,functionx neighborsg,x,mode=in将该函数应用于图中的所有节点,并给出每个节点的父节点列表。我们感兴趣的是没有父节点的节点,所以我们想要列表长度为零的节点。因此,我们将长度应用于父列表,并检查哪些长度为零

在此输入代码如果图形包含自循环,G5W的解决方案将失败。另一种办法:

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)

在此输入代码如果图形包含自循环,G5W的解决方案将失败。另一种办法:

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)

请求帮助时,您应该提供一个示例输入数据和该输入的所需结果。这样就可以测试和验证可能的解决方案。你需要明确我们的编程问题是什么。如果您对数据分析或算法有一般性问题,您最好在请求帮助时询问,您应该提供一个示例输入数据和该输入所需的结果。这样就可以测试和验证可能的解决方案。你需要明确我们的编程问题是什么。如果你有关于数据分析或算法的一般性问题,你最好在魔兽世界问一下。非常感谢G5W。这非常有帮助,也很容易理解。干杯哇!非常感谢G5W。这非常有帮助,也很容易理解。干杯