在igraph中将边缘度在0之外的节点包括在内

时间:2018-08-02 13:41:30

标签: r igraph edges

我正在跟踪我在这里问过的上一个问题:Calculating ratio of reciprocated ties for each node in igraph

答案非常有帮助,但是我意识到其中一种计算方法不正确。我正在尝试计算往复运动的边缘与外倾角的比率-换句话说,我提名为朋友的人提名我为朋友的百分比是多少?

如果学生不提名朋友(学位为0),则他们不包括在我对等关系的计算中。由于他们没有任何可互惠关系,因此我希望将其互惠度计算为0。他们的可互惠关系比率/输出度也应为0。

这是一个例子:

library(igraph)    

###Creating sample edgelist###
from<- c("A", "A", "A", "B", "B", "B", "C", "D", "D", "E")
to<- c("B", "C", "D", "A", "E", "D", "A", "B", "C", "E")
weight<- c(1,2,3,2,1,3,2,2,1,1)
g2<- as.matrix(cbind(from,to, weight))

###Converting edgelist to network###
g3=graph.edgelist(g2[,1:2])
E(g3)$weight=as.numeric(g2[,3])

###Removing self-loop###
g3<-simplify(g3, remove.loops = T)

在这里,E的入度为1,出度为0。我为E创建了一个自环,因此入度和出度向量保持相同的长度,然后将其删除。

接下来,我看到哪些提名可以兑现:

recip<-is.mutual(g3)
recip<-as.data.frame(recip)

然后我从g3创建一个边缘列表,并将recip添加到数据框中:

###Creating edgelist and adding recipe###
edgelist<- get.data.frame(g3, what = "edges")
colnames(edgelist)<- c("from", "to", "weight")

edgelist<- cbind(edgelist, recip)
edgelist

> edgelist
  from to weight recip
1    A  B      1  TRUE
2    A  C      2  TRUE
3    A  D      3 FALSE
4    B  A      2  TRUE
5    B  D      3  TRUE
6    B  E      1 FALSE
7    C  A      2  TRUE
8    D  B      2  TRUE
9    D  C      1 FALSE

这是麻烦开始的地方。由于E不在from中,所以它也不在我在下面创建的对象中。

接下来,我创建一个具有outdegree的表并添加顶点名称:

##Creating outdegree and adding vertex IDs##
outdegree<- as.data.frame(degree(g3, mode="out"))

ID<-V(g3)$name
outdegree<-cbind(ID, outdegree)
colnames(outdegree) <- c("ID","outdegree")
rownames(outdegree)<-NULL
outdegree

Outdegree随我便出来:

 ID outdegree
1  A         3
2  B         3
3  C         1
4  D         2
5  E         0

当我计算每个节点的往复联系数时,不包括E,因为我使用了上面讨论的from中的edgelist列。

##Calculating number of reciprocated ties##
recip<-aggregate(recip~from,edgelist,sum)
colnames(recip)<- c("ID", "recip")
recip

> recip
  ID recip
1  A     2
2  B     2
3  C     1
4  D     1

这就是问题所在。如果尝试创建表中往复关系与外部度的比率,则不包括E:

##Creating ratio table##
ratio<-merge(recip, outdegree, by= "ID")
ratio<-as.data.frame (recip$recip/ratio$outdegree)
ratio<- cbind(recip$ID, ratio)
colnames(ratio)<- c("ID", "ratio")
ratio

  ID     ratio
1  A 0.6666667
2  B 0.6666667
3  C 1.0000000
4  D 0.5000000

最终,我想在ratio中为E等于0的行。由于此处的比率为0/0(0个往复关系/ 0度),我可能会得到NaN,但我可以转换轻松地将其设置为0,就可以了。

我可以解决此问题,并将数据导出到Excel,手动运行计算,并保持简单。但这无助于提高我的编码技能,而且我有很多网络要运行,因此效率也很低。

关于如何实现此自动化的任何想法?

再次感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

E未显示,因为E数据框中的from列中没有recip!它仅在to中。

您可以在两列上aggregate,然后合并。

r1 <- aggregate(recip~from,edgelist,sum)
colnames(r1) <- c("ID", "recip")
r2 <- aggregate(recip~to,edgelist,sum)
colnames(r2) <- c("ID", "recip")
recip <- merge(r1,r2, all = T) # all = T gives the union of the df's

哪个给:

  ID recip
1  A     2
2  B     2
3  C     1
4  D     1
5  E     0

还有花线:

library(dplyr)

edgelist %>% 
    aggregate(recip~from,.,sum) %>% 
    rename(ID = from) %>% 
    merge(., edgelist %>% 
                 aggregate(recip~to,.,sum) %>% 
                 rename(ID = to), 
          all = T)