2016-05-20 206 views
1

對不起,我對這個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的索引不一定等於邊中的ID在圖表g。

了替代的實現的問題是,它給了我錯誤

我只是一個測試數據幀的工作DF以上

回答

-1

如其中主要是「從另一個圖形無法使用的邊緣」一你目前的代碼中幾乎沒有錯誤。

  1. 我知道這只是一個例子,但是您的數據框架沒有正確構建。

  2. 您經常使用'='爲變量賦值,但在R中使用'< - '來代替。

  3. 你需要更多的代碼來捕獲節點「C」

  4. 一次似乎工作拆卸for循環,並刪除所有邊緣。

這似乎是做你想讓它爲節點「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) 
} 
+0

西爾維亞您好,感謝您的幫助!其實我想刪除在list_to_delete中索引的所有邊。但我設法使用 graph - list_of_incident_edges [[1]] [list_to_delete]。 –

+0

對,對不起。在複製粘貼時,這會丟失。另外我認爲你應該將問題標記爲回答/接受答案,所以它被標記爲以某種方式解決。 – Sylvia