R:收集列表中选定节点旁边的igraph节点

问题描述 投票:2回答:1

将玩具图定义为:

> library(igraph)
> g = graph( c("John", "Jim",
               "Jim", "Jill", 
               "Jill", "John",
               "Jim", "Bob",
               "Bob", "Alice", 
               "Alice", "Jill"),
            directed=FALSE)

随机选择2个节点:

> select = V(g)[sample(1:5,2)]
> select
+ 2/5 vertices, named, from b165a23:
[1] John Jim

确定紧邻图2中上述两个节点的节点:

> adj = adjacent_vertices(g,select,mode="all")
> adj
$John
+ 2/5 vertices, named, from b165a23:
[1] Jim  Jill
$Jim
+ 3/5 vertices, named, from b165a23:
[1] John Jill Bob 

我得到的是列表adj由2个列表组成:adj$Johnadj$Jim。 我想要的是收集John和Jim附近的所有节点,即: 吉姆,吉尔,约翰,吉尔和鲍勃 然后将它们放在一个列表中。 Jill是故意重复的,因为我实际上对计算边缘存根感兴趣。

我确实尝试了各种方法,例如:

sel_list=adj$John
for  (ii = 2:(length(adj)) {
  sel_list = append(sel_list,adj[[ii]]) 
}

要么

sel_list = c()
for  (ii = 1:(length(adj)) {
  sel_list = c(sel_list,adj[[ii]]) 
}

上面的确给了我一个顶点列表,但只捕获列表adj[[ii]]的第一个组成部分。对于大问题,我需要一种方法来收集所有相邻的顶点而不需要使用另一个昂贵的for循环来捕获adj[[ii]]的所有元素,例如丑陋的黑客:

sel_list = c()
for  (ii = 1:(length(adj)) {
  int_list=c()
  for (kk in 1:length(adj[[ii]]) {
    int_list=c(int_list,adj[[ii]][kk])
  }
  sel_list = c(sel_list,int_list) 
}

由于我不理解的原因,它没有像我预期的那样捕获adj[[ii]]中的所有节点。

选择所有相邻节点到一组其他节点并将它们放在一个简单列表中的最佳方法是什么?

r graph igraph adjacency-list
1个回答
2
投票

你可以只使用unlist(adj)并使用它来索引到V(g)我会重复一些问题的代码并设置随机种子以使结果可重复,

set.seed(26)
select = V(g)[sample(1:5,2)]
select
+ 2/5 vertices, named, from e2f7066:
[1] John Jim 

adj = adjacent_vertices(g,select,mode="all")
N = unlist(adj)
V(g)[N]
+ 5/5 vertices, named, from e2f7066:
[1] Jim  Jill John Jill Bob 
© www.soinside.com 2019 - 2024. All rights reserved.