2017-12-29 24 views
2

として玩具グラフを定義:無作為として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]]のすべてのノードをキャプチャしていないことを理解してください。

隣接するすべてのノードを他のノードのセットに選択して単純なリストに入れる最良の方法はありますか?

答えて

2

あなただけunlist(adj)をすることができますし、私は質問からいくつかのコードを繰り返し、結果が再現可能にするためにランダムシードを設定し、

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 
+0

G3ますV(g) へのインデックスにそれを使用 - > G:グッドキャッチ!ちょうどタイプミス。修正されました。 – Cbhihe

+0

私は周りを遊んでいるから、これは 'adj'の各隣接リストの最初のノードの回復のみを許可します。この場合、JimとJohnを隣接する頂点のリストに入れるだけです。 JillとBobは落ちました....私は 'recursive = TRUE'を使って' unlist'を実装しました。これはとにかくデフォルトです。それはその行動を変えない。チェックするにはis.element( "Jill"、V(g)[unlist(adj)])を実行します。私は何か基本的なものを欠いています – Cbhihe

+1

このコードは私には役に立ちます。あなたのテスト '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

関連する問題