2013-05-16 21 views
9

私の問題は非常に単純です:私はエッジリストから隣接リスト/マトリックスを作成する必要があります。エッジリストから加重隣接リスト/マトリックスを作成する方法は?

私はcsv文書にcolumn1 = node1とcolumn2 = node2という形で格納されているエッジリストを持っています。これを加重隣接リストまたは加重隣接行列に変換したいと思います。このことから、加重隣接リスト/行列への変換を達成するためにどのように

node1,node2 
551,548 
510,512 
548,553 
505,504 
510,512 
552,543 
512,510 
512,510 
551,548 
548,543 
543,547 
543,548 
548,543 
548,542 

任意のヒント:正確には

は、ここ-where数字は単にノードIDでのように、データがどのように見えるかですか?

dat=read.csv(file.choose(),header=TRUE) # choose an edgelist in .csv file format 
el=as.matrix(dat) # coerces the data into a two-column matrix format that igraph likes 
el[,1]=as.character(el[,1]) 
el[,2]=as.character(el[,2]) 
g=graph.edgelist(el,directed=FALSE) # turns the edgelist into a 'graph object' 

ありがとう: これは私が成功せず、以前にそれを行うことを決議(Dai Shizukaの礼儀)方法です!

+2

小さな再現可能な例とこれをコーディングする可能性のある試みを教えてください。 –

+0

[この投稿](http://stackoverflow.com/questions/14332233/using-graph-adjacency-in-r/14332667#14332667)が役立ちます。 – Arun

+0

そのポストに私を指摘してくれてありがとう@Arun。本当に便利ですが、間違っていないとデータが既に行列形式で整理されていますが、編集したバージョンの質問からわかるように、私は別の入力があります。投稿を編集することで、ローマにも返信して欲しいと思います。 – Milo

答えて

15

この応答はベースRのみを使用します。結果は、隣接行列を表すために使用される標準行列です。ここで

el <- cbind(a=1:5, b=5:1) #edgelist (a=origin, b=destination) 
mat <- matrix(0, 5, 5) 
mat[el] <- 1 
mat 
# [,1] [,2] [,3] [,4] [,5] 
#[1,] 0 0 0 0 1 
#[2,] 0 0 0 1 0 
#[3,] 0 0 1 0 0 
#[4,] 0 1 0 0 0 
#[5,] 1 0 0 0 0 

matはベクトル1:55:1の簡単なcbindあるedgelist elから定義された自分の隣接行列、です。

edgelistにウェイトが含まれている場合は、若干異なる解決策が必要です。

el <- cbind(a=1:5, b=5:1, c=c(3,1,2,1,1)) # edgelist (a=origin, b=destination, c=weight) 
mat<-matrix(0, 5, 5) 
for(i in 1:NROW(el)) mat[ el[i,1], el[i,2] ] <- el[i,3] # SEE UPDATE 
mat 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 0 0 0 0 3 
#[2,] 0 0 0 1 0 
#[3,] 0 0 2 0 0 
#[4,] 0 1 0 0 0 
#[5,] 1 0 0 0 0 

UPDATE

は、いくつかの時間後、私は、以前の加重edgelist例のループ(3行目)のために不要であることに気づきました。あなたは、次のベクトル化操作でそれを置き換えることができます。

mat[el[,1:2]] <- el[,3] 
14

ご質問(https://sites.google.com/site/daishizuka/toolkits/sna/sna_data)に言及して私のウェブサイト上の記事はIGRAPHパッケージを使用するため、それがロードされていることを確認してください。

また、igraphは、graph.data.frame()を使用して、エッジライブラリから加重隣接行列を作成する方がはるかに簡単な方法を提供しています。私は自分のサイトでこれを更新しましたが、ここには簡単な例があります:

library(igraph) 
el=matrix(c('a','b','c','d','a','d','a','b','c','d'),ncol=2,byrow=TRUE) #a sample edgelist 
g=graph.data.frame(el) 
get.adjacency(g,sparse=FALSE) 

これはすべきです。 sparse = FALSE引数は、隣接行列に0を表示するように指示します。 あなたが本当にIGRAPHを使用しない場合、私は、これはそれを行うには不格好な方法だと思います:

el=matrix(c('a','b','c','d','a','d','a','b','c','d'),ncol=2,byrow=TRUE) #a sample edgelist 
lab=names(table(el)) #extract the existing node IDs 
mat=matrix(0,nrow=length(lab),ncol=length(lab),dimnames=list(lab,lab)) #create a matrix of 0s with the node IDs as rows and columns 
for (i in 1:nrow(el)) mat[el[i,1],el[i,2]]=mat[el[i,1],el[i,2]]+1 #for each row in the edgelist, find the appropriate cell in the empty matrix and add 1. 
+0

重み付けされたネットワークの場合、 'get.adjacency()'呼び出しに 'attr = 'weight''を追加して、重み付けされていないバージョンの代わりに重み付けされた隣接行列を返すようにしたいとします。 –

+0

偉大なリンク、それはまた、エッジのリストをインポートするフレームの使用を示しています。 Pythonで同等のAPIが表示されない:/ – user305883

0

qdapToolsとのもう一つの可能​​性パッケージ:あなたのデータを

library(qdapTools) 

el[rep(seq_len(nrow(el)), el[,'c']), c('a', 'b')] %>% 
    {split(.[,'b'], .[,'a'])} %>% 
    mtabulate() 

## 1 2 3 4 5 
## 1 0 0 0 0 3 
## 2 0 0 0 1 0 
## 3 0 0 2 0 0 
## 4 0 1 0 0 0 
## 5 1 0 0 0 0 
1

スタートフレームエッジと隣接行列を取得するためにIGRAPHを使用:

ヘッド(エッジ)

node1 node2 
1 551 548 
2 510 512 
3 548 553 
4 505 504 
5 510 512 
6 552 543 

library(igraph) 
as.matrix(get.adjacency(graph.data.frame(edges))) 

    551 510 548 505 552 512 543 553 504 547 542 
551 0 0 2 0 0 0 0 0 0 0 0 
510 0 0 0 0 0 2 0 0 0 0 0 
548 0 0 0 0 0 0 2 1 0 0 1 
505 0 0 0 0 0 0 0 0 1 0 0 
552 0 0 0 0 0 0 1 0 0 0 0 
512 0 2 0 0 0 0 0 0 0 0 0 
543 0 0 1 0 0 0 0 0 0 1 0 
553 0 0 0 0 0 0 0 0 0 0 0 
504 0 0 0 0 0 0 0 0 0 0 0 
547 0 0 0 0 0 0 0 0 0 0 0 
542 0 0 0 0 0 0 0 0 0 0 0 
関連する問題