ノード A、ノード B の 2 つの列を持つ data.frame があります。フレーム内の各エントリは、ノード A と B の間のグラフのエッジを意味します。
この data.frame を隣接リストに変換するには、ワンライナーが必要です。ヒントはありますか?
このigraphにタグを付けたので、組み込みの機能を使用するのはどうですか?
> g <- graph.data.frame( edges )
> adjlist <- get.adjedgelist(g)
唯一の注意点は、頂点のインデックスが 0 であることです。これは、igraph 0.6 で変更されます。
速くて汚い..。
> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5))
> adjlist <- by(edges, edges$nodea, function(x) x$nodeb)
> for (i in as.character(unique(edges$nodea))) {
+ cat(i, ' -> ', adjlist[[i]], '\n')
+ }
1 -> 1 5
2 -> 2 4
4 -> 3
> adjlist
edges$nodea: 1
[1] 1 5
------------------------------------------------------------
edges$nodea: 2
[1] 2 4
------------------------------------------------------------
edges$nodea: 4
[1] 3
Rで隣接リストをどのように表現しますか? 隣接ノードのセットには可変サイズのリストが必要です。そのため、list(); を使用する必要があります。しかし、Rでそれを使用することは何のメリットがありますか?
私は sapply のような関数を使った不完全なトリックを考えることができますが、それらはすべてのノードに対して線形スキャンを行います。しかし、1 分間遊んでみると、次のようになります: ペアリストのリスト。各ペアの 2 番目の項目は隣接リストです。出力は、データ構造が実際よりもクレイジーです。
> edgelist=data.frame(A=c(1,1,2,2,2),B=c(1,2,2,3,4))
> library(plyr)
> llply(1:max(edgelist), function(a) list(node=a, adjacents=as.list(edgelist$B[edgelist$A==a])))
[[1]]
[[1]]$node
[1] 1
[[1]]$adjacents
[[1]]$adjacents[[1]]
[1] 1
[[1]]$adjacents[[2]]
[1] 2
[[2]]
[[2]]$node
[1] 2
[[2]]$adjacents
[[2]]$adjacents[[1]]
[1] 2
[[2]]$adjacents[[2]]
[1] 3
[[2]]$adjacents[[3]]
[1] 4
[[3]]
[[3]]$node
[1] 3
[[3]]$adjacents
list()
[[4]]
[[4]]$node
[1] 4
[[4]]$adjacents
list()