2
例如,對於每個頂點,我將如何計算針對男性的關係的百分比?如何根據igraph中的頂點「鄰居」屬性創建頂點屬性?
g <- erdos.renyi.game(20, .3, type=c("gnp"), directed = TRUE)
V(g)$male <- rbinom(20,1,.5)
V(g)$male[10] <- NA
例如,對於每個頂點,我將如何計算針對男性的關係的百分比?如何根據igraph中的頂點「鄰居」屬性創建頂點屬性?
g <- erdos.renyi.game(20, .3, type=c("gnp"), directed = TRUE)
V(g)$male <- rbinom(20,1,.5)
V(g)$male[10] <- NA
的可能(沒有必要最優)解決方案如下(這是一個單行線,我只是把它分解爲可讀性的緣故):
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向量,並將其按照頂點的出度分成元素以獲得比率。
謝謝Tamas!除非我錯了,當男性指標缺失時,結果與男性= 0相同......將下面的粗體代碼添加到neis函數中可能是正確的嗎? {sum(V(g)[neis] $ male,na.rm = T **/sum(is.na(V(g)[neis] $ male)**} –
應該是:sum(!is。 na(V(g)[neis] $男) –
是的,那應該沒問題,不過要小心零分,但在你的情況下,我認爲將分子想象爲「強零」是有道理的。最簡單的方法可能是將列表中的NaN值替換爲零。 –