我需要模拟基于不同节点属性从R中的igraph中删除网络节点的影响。我创建了一个函数,在其下创建一个基于节点的矩阵及其相应的中介中心性,对此进行排序,然后循环遍历矩阵中的每个节点,删除节点并计算最大连通组件的大小,打印此输出进行分析。
testbet<- function(g){
n<-length(V(g))
mat<- matrix(ncol=2,nrow=n, 0) #betweenness attack
mat[,1]<-1:n
bet<-betweenness(g)
mat[,2]<-bet
matri<-mat[order(mat[,2]),]
g2<-g
for(i in 1:n){
v=n+1-i
g2<-delete.vertices(g2, matri[v,1])
maxcsize2<-max(clusters(g2)$csize)
print(maxcsize2)
}
}
当它运行时,它开始将输出打印到一个点,然后我收到错误消息:
Error in .Call("R_igraph_delete_vertices", graph, as.igraph.vs(graph, :
At iterators.c:759 : Cannot create iterator, invalid vertex id, Invalid vertex id
Called from: .Call("R_igraph_delete_vertices", graph, as.igraph.vs(graph,
v) - 1, PACKAGE = "igraph")
由于我非常困难,所以对此有任何帮助都会非常感激。
答案 0 :(得分:0)
我认为您的错误正在出现,因为g2
中的顶点ID正在动态重新生成,所以即使您删除顶点41
,ID也会重置为1:99
,然后当您去删除顶点100
你得到一个错误。您可以通过为图形顶点提供唯一的名称属性并对其进行索引来解决此问题。
library(igraph)
g <- random.graph.game(100, 0.2)
V(g)$names <- paste0("v", 1:length(V(g))) #assign unique name
testbet <- function(g){
n <- length(V(g))
mat <- matrix(ncol=2,nrow=n, 0)
mat[,1] <- V(g)$names #add vertex name to matrix
bet <- betweenness(g)
mat[,2] <- bet
matri <- mat[order(mat[,2], decreasing = TRUE),]
g2 <- g
clustersizes<-integer(n-1)
for(i in 1:(n-1)){
g2 <- delete.vertices(g2, v=which(V(g2)$names==matri[i,1])) #index by name
maxcsize2 <- max(clusters(g2)$csize)
clustersizes[i]<-maxcsize2
}
df<-as.data.frame(cbind(matri, c(clustersizes, NA)))
names(df)<-c("vertex_removed", "betweenness", "maxcsize")
return(df)
}
df<-testbet(g)