我正在计算教室中学生的相互友爱比例。我创建了一个名为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。因此该比率将为相互联系/出学位。
答案 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