我想扩充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]&lt; - 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
的新手,所以可以随心所欲地表达自己的意思。
由于
答案 0 :(得分:1)
作业G[] <-
只需要一个逻辑值(即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
的{{1}}表示从(i,j)
到i
的边缘。
如您所见,在这种情况下,只有一条边j
(显然2,3
因为是无向图)
然后,通过设置3,2
,您强制G[1:4,1:4] <- TRUE
中所有顶点之间的边缘,相反,通过设置(1,4)
,您将删除{{1}中所有顶点之间的所有边}}
因此,这些方法不太适合选择性地“批量改变”邻接矩阵,因为你只能创建或删除矩阵子集中的所有边。
在我看来,更好的方法是将这种方法与G[1:4,1:4] <- FALSE
结合起来;例如,如果要更改(1,4)
adj。要连接add.edges
和(1,4)
的子矩阵,您可以这样做:
(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)
。