2011-10-02 132 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值替换为零。 –