如何根据 igraph 中顶点的邻居属性创建顶点属性?

Posted

技术标签:

【中文标题】如何根据 igraph 中顶点的邻居属性创建顶点属性?【英文标题】:How do I create vertex attributes based on vertices' neighbors' attributes in igraph? 【发布时间】:2011-10-02 19:11:44 【问题描述】:

例如,对于每个顶点,我将如何计算向外指向男性的关系百分比?

g <- erdos.renyi.game(20, .3, type=c("gnp"), directed = TRUE)
V(g)$male <- rbinom(20,1,.5)
V(g)$male[10] <- NA

【问题讨论】:

【参考方案1】:

一个可能的(不一定是最佳的)解决方案如下(这是一行,为了便于阅读,我只是将其分解):

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 相同......将以下粗体代码添加到函数 neis 可能会正确吗? sum(V(g)[neis]$male, na.rm=T /sum(is.na(V(g)[neis]$male) 应该是:sum(!is.na(V(g)[neis]$male) 是的,应该没问题。但是,请注意除以零;在您的情况下,我认为将分子视为“强零”是有道理的。最简单的方法可能是之后用零替换列表中的 NaN 值。

以上是关于如何根据 igraph 中顶点的邻居属性创建顶点属性?的主要内容,如果未能解决你的问题,请参考以下文章

保存/检索igraph图形属性

从数据帧格式化 igraph 饼图顶点值

如何将值向量分配给R中igraph中的顶点标签?

如何从图中删除顶点并在其邻居之间创建边?

使用igraph查找连接到顶点的所有顶点?

igraph:使用graph.edgelist而不是graph_from_data_frame时顶点名称无效[关闭]