从igraph

时间:2016-05-20 09:05:45

标签: r igraph

抱歉,我对这个igraph包很新 现在我有一个非简单的循环,我试图通过遍历每个节点并删除符合特定条件的边来简化循环。我一直在研究这个问题几个小时,并希望有一些建议来解决这个问题。

现在我正在处理一个函数,给定图的顶点,然后我们想要消除长度小于该特定顶点的所有这些边的最大长度的所有边

df=data.frame(node("A","A","B","B","A"),edge("B","C","C","A","B"),length(1,1,1,1,10))
g<-graph_from_data_frame(df)
delete_extra_edges<-function(g,node){
   list_of_incident_edges=incident_edges(g,node,"out")
   max_quantity<-max(unlist(list_of_incident_edges[[1]]$length))
   list_to_delete=which(list_of_incident_edges[[1]]$length<max_quantity)
   for(index in list_to_delete){
       g<-delete_edges(g,index) #or alternatively: g<-g-list_of_incident_edges[[1]][index]
   }
   return(g)
   }

这个方法的问题在于(除了它仍将保留多条边长度与最大长度相同的事实,但我稍后会处理),list_to_delete的索引不一定等于图g中的边ID。

替代实现的问题在于它给了我“不能使用来自另一个图形的边缘”错误

我正在使用上面定义的测试数据框df

1 个答案:

答案 0 :(得分:0)

您当前的代码中存在一些错误。

  1. 我知道这只是一个例子,但您的数据框架构建不正确。

  2. 您经常使用'='为变量赋值,但在R中您使用'&lt; - '代替。

  3. 您需要更多代码来捕获节点“C”

  4. 删除for循环并立即删除所有边缘似乎都有效。

  5. 这似乎正在为节点“A”执行您想要的操作:

    library(igraph)
    node <- c("A","A","B","B","A")
    edge <- c("B","C","C","A","B")
    length <- c(1,1,1,1,10)
    
    df<-data.frame(node,edge,length)
    g<-graph_from_data_frame(df)
    delete_extra_edges<-function(graph,node){
      list_of_incident_edges<-incident_edges(graph,node,"out")
      max_quantity<-max(unlist(list_of_incident_edges[[1]]$length))
      list_to_delete <- which(list_of_incident_edges[[1]]$length < max_quantity)
      newgraph <- graph - list_of_incident_edges[[1]]
      return(newgraph)
    }