将玩具图定义为:
> 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
我得到的是由{2}列表adj
和adj$John
组成的列表adj$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]]
中的所有节点。
选择所有相邻节点到一组其他节点并将它们放在一个简单列表中的最佳方法是什么?
答案 0 :(得分: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