【问题标题】:Calculating ratio of reciprocated ties for each node in igraph计算 igraph 中每个节点的往复关系比率
【发布时间】: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 -&gt; torecip = TRUE 的边会增加 fromto 的往复联系数,还是只增加 from 的往复联系数?
  • 感谢两位的快速回复。匿名,我添加了上面的数据集。我希望这可以澄清。 d125q,是的,如果 A 喜欢 B,并且该行的 recip=TRUE,那么 B 也喜欢 A,并且该行的 recip=TRUE。希望这会有所帮助。

标签: r dataframe igraph


【解决方案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 &lt;- 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

【讨论】:

  • 这就像一个魅力!谢谢你。我将更多地研究聚合函数和平均函数。真的很有帮助。再次感谢。
  • @Gary 太棒了!如果您认为此答案最有帮助,请单击绿色复选标记将其标记为答案。欢迎来到 SO!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多