首页 文章

R用于逐个从网络中删除节点并输出最大的连接组件

提问于
浏览
0

我需要模拟基于不同节点属性从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")

任何有关这方面的帮助都会非常感激,因为我非常困难 .

1 回答

  • 0

    我认为你的错误是因为 g2 中的顶点id被动态重新生成,所以即使你删除顶点 41 ,ids也会重置为 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)
    

相关问题