0

手伝っていただけませんか?

私は生態系の相互作用に取り組んでおり、それらのいくつかは多層ネットワーク(正確には多重化) としてモデル化されています。

この種のデータを R のパッケージigraphに入力する最良の方法は、エッジ リストとノード リストを使用することです。残念ながら、私の共同研究者はデータをそのように整理したことはなく、むしろ発生行列(二部ネットワーク) として整理しています。

私は常に、それらの行列を同じ次元で正確に整理し、行と列のラベルの順序を同じにして、簡単に組み合わせることができるようにするよう常に依頼しています。

これらの行列が手元にあるので、次の手順に基づいて長いコードを実行します。

  1. 2 つ以上の発生行列を R に読み込みます。

  2. それらのエッジと頂点のリストを抽出します。

  3. エッジ タイプに関する情報を各エッジ リストに追加します。

  4. 各頂点リストに頂点クラスに関する情報を追加します。

  5. これらのエッジ リストと頂点リストを別々にマージします。

  6. これらのマージされたリストを igraph に読み取って、多層グラフを作成します。

もっと簡単な解決策を探しています。関数unionを使用してみましたが、エッジの種類に関する情報を保持せずに、グラフとそのエッジをマージします。乱数行列を使用したこの例で何が起こるかを見てください。

number <- seq(1:10)

row <- "row"
rowlabels <- paste(row, number, sep = "")
column <- "col"
columnlabels <- paste(column, number, sep = "")

matrix1 <- matrix(data = rbinom(100,size=1,prob=0.5), nrow = 10, ncol = 10,
                  dimnames = list(rowlabels, columnlabels))
matrix2 <- matrix(data = rbinom(100,size=1,prob=0.5), nrow = 10, ncol = 10,
                  dimnames = list(rowlabels, columnlabels))
      
graph1 <- graph_from_incidence_matrix(matrix1, directed = F)
graph2 <- graph_from_incidence_matrix(matrix2, directed = F)
       
E(graph1)$type = "layer1"
E(graph2)$type = "layer2"
    
graph_multi <- union(graph1, graph2)
graph_multi
E(graph_multi)$type

igraphで複数の入射行列を組み合わせて多層グラフを作成する簡単な方法はありますか?

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

4

1 に答える 1

2

データをデータ フレームに変換し、単一のエッジリストに結合して、最後のステップでグラフを作成します。次のようなもの:

set.seed(666)
number <- seq(1:10)
row <- "row"
rowlabels <- paste(row, number, sep = "")
column <- "col"
columnlabels <- paste(column, number, sep = "")
matrix1 <- matrix(data = rbinom(100,size=1,prob=0.5), nrow = 10, ncol = 10,
                  dimnames = list(rowlabels, columnlabels))
matrix2 <- matrix(data = rbinom(100,size=1,prob=0.5), nrow = 10, ncol = 10,
                  dimnames = list(rowlabels, columnlabels))


library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(igraph)
#> 
#> Attaching package: 'igraph'
#> The following objects are masked from 'package:dplyr':
#> 
#>     as_data_frame, groups, union
#> The following objects are masked from 'package:stats':
#> 
#>     decompose, spectrum
#> The following object is masked from 'package:base':
#> 
#>     union

edb <- bind_rows(
  as.data.frame(as.table(matrix1)),
  as.data.frame(as.table(matrix2)),
  .id = "layer"
) %>%
  filter(Freq != 0) %>%
  select(
    from = Var1,
    to = Var2,
    layer
  )

# from, to, layer
head(edb)
#>   from   to layer
#> 1 row1 col1     1
#> 2 row3 col1     1
#> 3 row6 col1     1
#> 4 row7 col1     1
#> 5 row1 col2     1
#> 6 row6 col2     1

multig <- graph_from_data_frame(edb, directed=FALSE)
multig
#> IGRAPH c377bd8 UN-- 20 110 -- 
#> + attr: name (v/c), layer (e/c)
#> + edges from c377bd8 (vertex names):
#>  [1] row1 --col1 row3 --col1 row6 --col1 row7 --col1 row1 --col2 row6 --col2
#>  [7] row8 --col2 row1 --col3 row2 --col3 row5 --col3 row8 --col3 row9 --col3
#> [13] row10--col3 row3 --col4 row4 --col4 row5 --col4 row8 --col4 row9 --col4
#> [19] row10--col4 row2 --col5 row4 --col5 row5 --col5 row6 --col5 row8 --col5
#> [25] row9 --col5 row10--col5 row4 --col6 row6 --col6 row8 --col6 row1 --col7
#> [31] row2 --col7 row4 --col7 row5 --col7 row8 --col7 row9 --col7 row10--col7
#> [37] row1 --col8 row3 --col8 row4 --col8 row6 --col8 row7 --col8 row9 --col8
#> [43] row10--col8 row1 --col9 row2 --col9 row4 --col9 row6 --col9 row7 --col9
#> + ... omitted several edges

table(E(multig)$layer)
#> 
#>  1  2 
#> 55 55
于 2020-10-23T09:31:40.527 に答える