如何在igraph中基于顶点的邻居属性创建顶点属性?

3
例如,我如何计算每个顶点向男性指向的链接所占的比例?
g <- erdos.renyi.game(20, .3, type=c("gnp"), directed = TRUE)
V(g)$male <- rbinom(20,1,.5)
V(g)$male[10] <- NA
1个回答

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向量,并按元素逐个除以顶点的出度以获得比率。

谢谢Tamas!除非我弄错了,当男性指示器缺失时,它的结果与male=0相同...将以下粗体代码添加到函数neis可能会使其正确吗?{ sum(V(g)[neis]$male, na.rm=T / sum(is.na(V(g)[neis]$male) } - Michael Bishop
sum(!is.na(V(g)[neis]$male))应该是您要的代码。 - Michael Bishop
没问题,但要注意除以零的情况;在您的情况下,我认为将分子视为“强零”是有道理的。最简单的方法可能是在列表中将NaN值替换为零。 - Tamás

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接