在 igraph 中包含出度为 0 的边列表中的节点
Including nodes in edge list with outdegree of 0 in igraph
我正在跟进我在此处提出的先前问题:
答案非常有帮助,但我意识到其中一项计算结果不正确。我试图计算出往复边与出度的比率——换句话说,我提名为朋友的人中有多少百分比提名我为朋友?
当学生不提名朋友时(outdegree 为 0),他们不包括在我计算的互惠关系中。因为他们不能有任何互惠关系,所以我希望他们的互惠计算为0。他们的互惠比率ties/outdegree也应该是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
中,它也不在我下面创建的对象中。
接下来,我创建一个带有出度的 table 并添加顶点名称:
##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,因为我使用了上面讨论的 edgelist
中的 from
列。
##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
这就是问题所在。如果尝试创建一个 table 与往复关系与出度的比率,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 往复 ties/0 出度),我可能会得到一个 NaN但我可以轻松地将其转换为 0,这样就可以了。
我可以解决这个问题并将数据导出到 Excel,运行 手动计算,并保持简单。但这无助于提高我的编码技能,而且我有一堆网络可以运行,所以效率也很低。
对如何自动执行此操作有任何想法吗?
再次感谢您的帮助。
E
没有显示,因为 E
不在 recip
数据框中的 from
列中!它仅在 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)
我正在跟进我在此处提出的先前问题:
答案非常有帮助,但我意识到其中一项计算结果不正确。我试图计算出往复边与出度的比率——换句话说,我提名为朋友的人中有多少百分比提名我为朋友?
当学生不提名朋友时(outdegree 为 0),他们不包括在我计算的互惠关系中。因为他们不能有任何互惠关系,所以我希望他们的互惠计算为0。他们的互惠比率ties/outdegree也应该是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
中,它也不在我下面创建的对象中。
接下来,我创建一个带有出度的 table 并添加顶点名称:
##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,因为我使用了上面讨论的 edgelist
中的 from
列。
##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
这就是问题所在。如果尝试创建一个 table 与往复关系与出度的比率,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 往复 ties/0 出度),我可能会得到一个 NaN但我可以轻松地将其转换为 0,这样就可以了。
我可以解决这个问题并将数据导出到 Excel,运行 手动计算,并保持简单。但这无助于提高我的编码技能,而且我有一堆网络可以运行,所以效率也很低。
对如何自动执行此操作有任何想法吗?
再次感谢您的帮助。
E
没有显示,因为 E
不在 recip
数据框中的 from
列中!它仅在 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)