2011-10-02 92 views

回答

3

的可能(沒有必要最優)解決方案如下(這是一個單行線,我只是把它分解爲可讀性的緣故):

unlist(lapply(get.adjlist(g, mode="out"), 
     function (neis) { 
      sum(V(g)[neis]$male, na.rm=T) 
     } 
))/degree(g, mode="out") 

現在,讓我們把它分解成更小的件。首先,我們使用get.adjlist(g, mode="out")得到圖表的鄰接列表。這給出了一個向量列表,每個向量包含一個頂點的鄰居。然後,我們使用lapply將函數應用於此列表中的每個向量。正在應用的功能如下:

function (neis) { 
    sum(V(g)[neis]$male, na.rm=T) 
} 

的功能簡單地取一個節點的鄰居neis,並使用該從整個頂點選擇頂點的子集設置V(g)。然後,爲該頂點子集檢索male屬性,並將這些值相加,從而移除NA值。本質上,這個函數爲您提供了neis中的男性人數。

現在,返回到我們的原始表達式,我們已經使用lapply將該函數應用於圖的鄰接列表,獲得數字列表,每個數字包含給定頂點的鄰居的數目。我們使用unlist將此列表轉換爲單個R向量,並將其按照頂點的出度分成元素以獲得比率。

+0

謝謝Tamas!除非我錯了,當男性指標缺失時,結果與男性= 0相同......將下面的粗體代碼添加到neis函數中可能是正確的嗎? {sum(V(g)[neis] $ male,na.rm = T **/sum(is.na(V(g)[neis] $ male)**} –

+0

應該是:sum(!is。 na(V(g)[neis] $男) –

+0

是的,那應該沒問題,不過要小心零分,但在你的情況下,我認爲將分子想象爲「強零」是有道理的。最簡單的方法可能是將列表中的NaN值替換爲零。 –

相關問題