2012-09-11 123 views
7

我試圖在R中使用包igraph挖掘3節點圖案。我想從graph.motifs()函數中獲取圖中每個單獨頂點的motif數量,這似乎不可能。如何在R中使用iGraph挖掘圖案

因此,對於例如圖:

testGraph = barabasi.game(10, 
m = 5, 
power = 2, 
out.pref = TRUE, 
zero.appeal = 0.5, 
directed = TRUE) 

我可以使用graph.motifs()計數在整個圖中的每個3節點基序的總數:

graph.motifs(testGraph, 
size = 3) 

[1] 0 0 26 0 16 0 2 58 0 0 0 0 0 0 0 0

但我想知道個人個人頂點參與。那麼,頂點1參與了多少個主題(以及哪種類型)?有沒有人知道一個簡單的方法來做到這一點?

回答

6

這是一個快速的操作方法。

它你有興趣在頂點一個的黑社會,那麼首先創建導出子含有一個和它的近鄰。您可以通過neighborhood()induced.subgraph()或簡單地通過graph.neighborhood()來完成此操作。

然後在這個子圖中找到圖案,但不是用graph.motifs(),而是用triad.census(),因爲這包括了所有可能的三元組,即使是沒有連接的三元組。

然後從該子圖中刪除A,並再次調用triad.census()。兩個計數向量的差異將正好是包括A的圖案。

+0

我會離開的實際代碼作爲練習。 :)但如果您遇到任何問題,請在這裏評論。 –

+0

謝謝Gabor,該解決方案爲我工作! –

6

這裏的Gabor解決方案的一個自包含的例子:

testGraph = barabasi.game(10, 
    m = 5, 
    power = 0.6, 
    out.pref = TRUE, 
    zero.appeal = 0.5, 
    directed = TRUE) 

# Label nodes to more easily keep track during subsets/deletions 
V(testGraph)$name = c('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten') 

subGraph = graph.neighborhood(testGraph, order = 1, V(testGraph)[1], mode = 'all')[[1]] 
allMotifs = triad.census(subGraph) 
removeNode = delete.vertices(subGraph, 'one') 
node1Motifs = allMotifs - triad.census(removeNode)