2

igraphグラフの隣接行列を拡張したいと考えています。次のことを試しましたが、成功しませんでした:

require(igraph)
require(Matrix)
set.seed(123) # to get always the same graph (see "R reproducible example")
G <- igraph::erdos.renyi.game(20,10,type="gnm")
mat <- Matrix(1:16, ncol=4,nrow=4)
G[1:4, 1:4] <- mat
# Error in `[<-.igraph`(`*tmp*`, 1:4, 1:4, value = <S4 object of class "dgeMatrix">) : 
# New value should be NULL, numeric or logical

また試してみました: G[1:4, 1:4] <- as.numeric(mat)

# Error in `[<-.igraph`(`*tmp*`, 1:4, 1:4, value = c(1, 2, 3, 4, 5, 6, 7, :
# Logical or numeric value must be of length 1

add.edges()関数については知っていますが、エッジを置き換えるのではなく、重みに追加するようです? 私がそれについて間違っている場合は、私も修正してください。

私は初めてなRので、必要に応じて冗長にしてください。

ありがとう

4

1 に答える 1

1

ドキュメントに記載されているように、代入G[] <-は 1 つの論理値 (TRUEまたは) のみを取ります。 (タイプ: FALSE

?`[<-.igraph` 

セクション「インデックス演算子」を確認してください)

たとえば、次の方法でグラフを作成するとします。

require(igraph)
set.seed(144) # just to get the same initial graph
G <- igraph::erdos.renyi.game(10,5,type="gnm")

plot.igraph(G,layout=layout.kamada.kawai)

初期グラフ

次に、次のようにします。

G[1:4,1:4]
>
[1,] . . . .
[2,] . . 1 .
[3,] . 1 . .
[4,] . . . .

4x4のスパース行列が得られます(0,1)。ここ1で、位置は からへ(i,j)のエッジがあることを示します。 ご覧のとおり、この場合、エッジは 1 つしかありません(無向グラフであることは明らかです)。ij
2,33,2

次に、G[1:4,1:4] <- TRUEですべての頂点間のエッジを強制するように設定し(1,4)、逆に でG[1:4,1:4] <- FALSEすべての頂点間のすべてのエッジを削除するように設定します(1,4)

したがって、これらの方法は、隣接行列を選択的に「バッチ変更」するのにはあまり適していません。これは、行列のサブセット内のすべてのエッジのみを作成または削除できるためです。

私の意見では、より良いアプローチは、このアプローチとadd.edges;を組み合わせることです。たとえば、(1,4)adj を変更したい場合。接続する部分行列(1,3)(2,4)、次のことができます。

G[1:4,1:4] <- FALSE # remove previous edges
G <- add.edges(G, c(1,3,2,4)) # add the new edges

実際、もう一度プロットします。

plot.igraph(G,layout=layout.kamada.kawai)

あなたはこれを得るでしょう:

修正されたグラフ

(2,3)エッジが削除され、新しいエッジ(1,3)(2,4)が追加されたことがわかります。

于 2013-10-27T11:44:04.513 に答える