として玩具グラフを定義:無作為として2つのノードR:リスト内で選択されたノードに隣接IGRAPHノードを収集
> library(igraph)
> g = graph(c("John", "Jim",
"Jim", "Jill",
"Jill", "John",
"Jim", "Bob",
"Bob", "Alice",
"Alice", "Jill"),
directed=FALSE)
選択:
> 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]]
の最初の要素を取り込みありません。その理由のために私にはない、
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]]
のすべての要素を、キャプチャするためにまだに他の高価なfor
ループを頼ることなく、すべての隣接する頂点を収集する方法が必要です私が期待した通りにadj[[ii]]
のすべてのノードをキャプチャしていないことを理解してください。
隣接するすべてのノードを他のノードのセットに選択して単純なリストに入れる最良の方法はありますか?
G3ます
V(g)
へのインデックスにそれを使用 - > G:グッドキャッチ!ちょうどタイプミス。修正されました。 – Cbhihe私は周りを遊んでいるから、これは 'adj'の各隣接リストの最初のノードの回復のみを許可します。この場合、JimとJohnを隣接する頂点のリストに入れるだけです。 JillとBobは落ちました....私は 'recursive = TRUE'を使って' unlist'を実装しました。これはとにかくデフォルトです。それはその行動を変えない。チェックするにはis.element( "Jill"、V(g)[unlist(adj)])を実行します。私は何か基本的なものを欠いています – Cbhihe
このコードは私には役に立ちます。あなたのテスト 'isylement(" Jill "、V(g)[unlist(adj)])'は失敗しますが、これはテストできないからです。 try 'is.element(" Jill "、V(g))'またfalseを返します。 'unclass(V(g)[N])'を見ると 'V(g)[N]'はノード_numbers_の名前付きリストです。このようにテストする必要があります。is.element(3、V(g)[N]) ' – G5W