【发布时间】:2018-12-17 08:50:28
【问题描述】:
我正在计算课堂上学生互惠友谊的比例。我创建了名为 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 的比率为 0.5。
我可以手动完成这一切,但我有 48 个这样的网络要运行,我希望它高效并防止错误。
有没有简单的方法来做到这一点?看起来 R 应该可以毫无问题地完成某些事情,但我很难找到解决方案。
感谢您的帮助。
注意:对于 R、社交网络分析和 stackoverflow 来说相当陌生。感谢您的帮助。
添加示例数据集和解决方案以响应 cmets
###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。因此,该比率将是互惠的关系/出度。
【问题讨论】:
-
欢迎来到 SO,请参阅 how to make a great reproducible example 了解如何改进您的问题,即提供示例数据集和您的预期结果,因为包括我在内的其他人可能不知道您的比例是多少寻找。
-
在计算往复联系数时,是否只计算
from节点?换句话说,from -> to与recip = TRUE的边会增加from和to的往复联系数,还是只增加from的往复联系数? -
感谢两位的快速回复。匿名,我添加了上面的数据集。我希望这可以澄清。 d125q,是的,如果 A 喜欢 B,并且该行的 recip=TRUE,那么 B 也喜欢 A,并且该行的 recip=TRUE。希望这会有所帮助。