12

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

column1 = node1 および column2 = node2 の csv ドキュメントに保存されているエッジ リストがあり、これを加重隣接リストまたは加重隣接マトリックスに変換したいと考えています。

より正確に言うと、データは次のようになります。数字は単にノード ID です。

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

これから加重隣接リスト/マトリックスに変換する方法に関するヒントはありますか? これは、成功せずに以前にそれを行うことを決意した方法です(Dai Shizukaの礼儀):

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'

ありがとうございました!

4

4 に答える 4

18

この応答はベース 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

ベクトルとの単純なmatedgelist から定義された隣接行列を次に示します。elcbind1:55:1

エッジリストに重みが含まれている場合は、少し異なるソリューションが必要です。

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

アップデート

しばらくして、前の加重エッジリストの例の for ループ (3 行目) が不要であることに気付きました。次のベクトル化された操作に置き換えることができます。

mat[el[,1:2]] <- el[,3]
于 2013-05-16T10:47:45.187 に答える
9

データ フレームのエッジから開始し、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
于 2016-10-04T06:26:38.213 に答える
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
于 2016-10-04T04:45:26.757 に答える