计算igraph中每个节点的往复关系比率

时间:2018-07-09 15:48:31

标签: r dataframe igraph

我正在计算教室中学生的相互友爱比例。我创建了一个名为SA1Pref.net的网络,并使用以下代码确定了每个学生的相互联系数量:

recip<-is.mutual(SA1Pref.net)
recip<-as.data.frame(recip)

这给了我以下数据框:

head(recip)

  recip
1 FALSE
2  TRUE
3 FALSE
4  TRUE
5  TRUE
6  TRUE

到目前为止,一切都很好。然后,从我的网络中创建一个边缘列表,并将其与往复式领带列表合并。所以现在我可以判断哪些节点是往复的,哪些不是:

edgelist<-as_data_frame(SA1Pref.net, what = "edges")
dyad<- cbind(edgelist, recip)

head(dyad)
          from       to weight recip
    1 S109.0.6 S105.0.5      2 FALSE
    2 S109.0.6 S103.0.2      2  TRUE
    3 S109.0.6 S110.0.8      1 FALSE
    4 S109.0.6 S115.0.3      1  TRUE
    5 S105.0.5 S103.0.2      1  TRUE   
    6 S105.0.5 S110.0.8      1  TRUE

“重量”与我的问题无关,请随时忽略。

我想做的是计算每个节点的往复式扎带数量。所以S109.0.6将是两个。一旦有了这些,我就想用每个节点的度数除以相互联系。我还为outdegree创建了一个数据框,如下所示:

head(outdegree)

              outdegree
    S109.0.6         4
    S105.0.5         3
    S103.0.2         3
    S110.0.8         4
    S115.0.3         6
    S108.1.6         4

因此,S109.0.6的比率为.5。

我可以手动完成所有操作,但是我要运行48个这样的网络,我希望它能高效运行并防止出错。

有没有简单的方法可以做到这一点?似乎R应该可以毫无问题地完成某些工作,但是我在寻找解决方案的时间上很糟糕。

谢谢您的帮助。

注意:R,社交网络分析和Stackoverflow的全新功能。感谢您的帮助。

添加示例数据集和解决方案以回应评论

###Edgelist of reciprocated nodes###

From<- c("A", "A", "A", "B", "B", "B", "C", "D", "D")

To<- c("B", "C", "D", "A", "C", "D", "A", "B", "C")

Recip<- c(TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, 
TRUE, FALSE)


fakenet<- data.frame(From, To, Recip)


> fakenet
  From To Recip
1    A  B  TRUE
2    A  C  TRUE
3    A  D FALSE
4    B  A  TRUE
5    B  C FALSE
6    B  D  TRUE
7    C  A  TRUE
8    D  B  TRUE
9    D  C FALSE


###Outdegree###

Student<- c("A","B","C","D")

Outdegree<- c(3, 3, 1, 2)

df.Outdegree<- data.frame(Student, Outdegree)

> df.Outdegree
  Student Outdegree
1       A         3
2       B         3
3       C         1
4       D         2

A的比率为0.67,因为它的外向度为3并且有两个往复关系。 B的比率也将是0.67,C的比率将是1,D的比率将是0.5。因此该比率将为相互联系/出学位。

1 个答案:

答案 0 :(得分:1)

这应该做您想要的。

outdegree$ratio <- aggregate(recip~from,dyad,sum)$recip/outdegree$outdegree
outdegree

##         outdegree     ratio
##S109.0.6         4 0.5000000
##S109.0.5         3 0.6666667

说明

aggregate根据行名将dyad中的数据分组在一起,并在每个组的sum列中应用recip函数。 在R中,当您对逻辑(布尔)向量执行sum时,它将添加所有TRUE值。我不确定您将其用于什么,但是您可能会还发现mean函数很有用,它将返回TRUE值与总数的比率。

该行的其余部分除以该行的相应出度。

如果要舍入它们,如示例所示,可以使用outdegree$ratio <- round(outdegree$ratio,2)

示例

使用您提供的额外数据集:

outdegree$ratio <- aggregate(recip~from,dyad,sum)$recip/outdegree$outdegree
outdegree$ratio <- round(outdegree$ratio,2)
outdegree

##  outdegree ratio
##A         3  0.67
##B         3  0.67
##C         1  1.00
##D         2  0.50