2017-02-03 8 views
3

私は次のエッジを持っています。listには、エッジをパス番号に関連付ける番号があります。 `1つのエッジリストの複数の隣接行列R

Begin edge end edge path number 
1    3   1 
3    4   1 
4    5   1 
6    3   2 
3    2   2` 

私はパスごとに隣接matricesを構築したい:これは私がTotallistを呼び出して、次のmatrixで与えられます。この例では、2つのmatricesが必要ですが、それ以上のものもあります。私は次のように書いたが、最初のパスにはmatrixしか見つからない。つまりので、私は余分な行や列を追加した理由

X<-as.data.frame(table(Totallist[,3])) 

nlines<-nrow(X) 
nlines 
freq<-X[1,2] 

diameterofmatrix<-max(Totallist) 

X1<-get.adjacency(graph.edgelist(as.matrix(Totallist[1:X[1,2],1:2]), directed=FALSE)) 
X1<-rbind(X1, 0) 
X1<-cbind(X1, 0) 
X1 

は、私はまた、すべてのmatricesは同じ次元である必要は:私は、私はそれで投げるパスの任意の数のために働く何かを書くことが方法がわかりませんよ。私は私の方法を使用し続けることができますが、それはかなり醜いようです。助けてくれてどうもありがとう。

答えて

1

次の操作を行うことができ、リスト(私はいくつかの偽のデータを生成する)に隣接行列を抽出するために:私たちは、ノードの要因を作る場合

set.seed(42) 
df <- data.frame(beginEdge = sample(1:10, 10, replace = TRUE), 
       endEdge = sample(1:10, 10, replace=TRUE), 
       pathNum = rep(c(1,2), each=5)) 
df 

     beginEdge endEdge pathNum 
1   10  5  1 
2   10  8  1 
3   3  10  1 
4   9  3  1 
5   7  5  1 
6   6  10  2 
7   8  10  2 
8   2  2  2 
9   7  5  2 
10   8  6  2 


paths <- unique(df$pathNum) # get the paths to iterate through 

、およびすべてのノードへの因子のレベルを設定します集団内では、ネットワーク内の集団の隣接行列が計算されます。ここでネットワークは10人の俳優であると仮定しています。観測データに作業するすべてのノードが含まれている場合は、レベルをunique(c(df$beginEdge,df$endEdge))に設定するか、好きなノードのセットを設定します。

df$beginEdge <- factor(df$beginEdge, levels=1:10) 
df$endEdge <- factor(df$endEdge, levels=1:10) 

現在のパスのリストを越えて行くと、リストとしてそれらを保存する行列を作成します。

list.of.adj.mats <- lapply(paths, function(i){ 
     matrix(as.numeric((
     table(df$beginEdge[df$pathNum==i], 
     df$endEdge[df$pathNum==i])+ 
     table(df$endEdge[df$pathNum==i], 
     df$beginEdge[df$pathNum==i]))>0), 
    nrow=length(levels(df$beginEdge)))}) 
list.of.adj.mats 
[[1]] 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 0 0 0 0 0 0 0 0 0  0 
[2,] 0 0 0 0 0 0 0 0 0  0 
[3,] 0 0 0 0 0 0 0 0 1  1 
[4,] 0 0 0 0 0 0 0 0 0  0 
[5,] 0 0 0 0 0 0 1 0 0  1 
[6,] 0 0 0 0 0 0 0 0 0  0 
[7,] 0 0 0 0 1 0 0 0 0  0 
[8,] 0 0 0 0 0 0 0 0 0  1 
[9,] 0 0 1 0 0 0 0 0 0  0 
[10,] 0 0 1 0 1 0 0 1 0  0 

[[2]] 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 0 0 0 0 0 0 0 0 0  0 
[2,] 0 1 0 0 0 0 0 0 0  0 
[3,] 0 0 0 0 0 0 0 0 0  0 
[4,] 0 0 0 0 0 0 0 0 0  0 
[5,] 0 0 0 0 0 0 1 0 0  0 
[6,] 0 0 0 0 0 0 0 1 0  1 
[7,] 0 0 0 0 1 0 0 0 0  0 
[8,] 0 0 0 0 0 1 0 0 0  1 
[9,] 0 0 0 0 0 0 0 0 0  0 
[10,] 0 0 0 0 0 1 0 1 0  0 
+0

は、返信用にありがとうございました。あなたの答えが与える隣接行列を見るだけで、対角に沿って対称でなければならないと思います。換言すれば、エントリ[i、j] =エントリ[j、i]。これはあなたの答えに当てはまるようではありませんか? – user7512228

+0

あなたが与えた例は、無向の隣接行列を計算することですので、対称である必要はありません。生成した行列は、パスを表すために無向の隣接行列に必要なすべての情報をエンコードします。しかし、必要な場合に対称行列を生成するようにコードを編集しましたが(それはちょっと面倒ですが)。 – gfgm

+0

ありがとう、私は対称隣接行列が必要だと言わねばならない。 – user7512228

関連する問題