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值替换为零。 –