R函数从网络中一个一个地删除节点并输出最大的连通分量

Posted

技术标签:

【中文标题】R函数从网络中一个一个地删除节点并输出最大的连通分量【英文标题】:R function to remove nodes from a network one by one and outputting the largest connected component 【发布时间】:2018-06-13 11:16:27 【问题描述】:

我需要根据不同的节点属性在 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】:

我认为您的错误是因为 g2 中的顶点 ID 正在动态重新生成,所以即使您删除顶点 41,ID 也会重置为 1:99,然后当您去删除顶点 @987654324 @你得到一个错误。您可以通过为图形顶点提供唯一名称属性并对其进行索引来解决此问题。

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)  

【讨论】:

谢谢你,我认为这是问题,只是不知道如何解决它。非常好用,非常感谢 有没有办法将结果存储在数据框中?打印对于一个变量来说很好,因为我可以将其导出以进行进一步分析 - 但是,如果我可以使用此函数来探索多个方面,例如平均度数、直径等,那就太好了。对此的任何帮助将不胜感激 编辑返回数据框 谢谢,这对我很有帮助,这意味着我可以向数据框添加一系列评估指标。一个认为我确实注意到了让我有点困惑的是,我预计中介中心性会随着最大连接组件的大小减小而减小,因为它意味着按该顺序删除节点。然而,它产生的数据框表明,中介中心性随着最大连接组件的大小的减小而波动。因此我不确定这是否正常工作? 我已经设法通过将订单代码调整为矩阵来解决这个问题

以上是关于R函数从网络中一个一个地删除节点并输出最大的连通分量的主要内容,如果未能解决你的问题,请参考以下文章

如何从列表中删除节点

HDU 4587 TWO NODES(割两个点的最大连通分支数)

如何在 R 中删除 igraph 中的节点?

60-R语言中的神经网络

如何根据条件选择R数据框中的连续行?

R语言gt包和gtExtras包优雅地漂亮地显示表格数据:gt_plt_winloss函数在表格中输出包含赢输值的列表,并输出一个内联图(inline plot)增加比赛次数改变内联图数据点的格