我正在使用igraph
包,我正在尝试构建一个计算不同算法实现的社区内边缘数的函数。我尝试连接函数内部的所有东西,甚至算法社区检测功能。像这样:
library("igraph")
intra.edges<-function(G,algorithm) {
if(algorithm==1){
Mod<-cluster_louvain(G)}
if(algoritmo==2){
Mod<-cluster_edge_betweenness(G)}
if(algoritmo==3){
Mod<-cluster_walktrap(G)}
Com<-as.data.frame(sizes(Mod))
NoCom<-as.vector(Com$Community.sizes)
vert<-NULL
for(i in 1:length(NoCom)){
M<-which(membership(Mod)==i)
sg<-induced.subgraph(G,M)
c.ec<-ecount(sg)
vert<-c.ec
}
intra<-data.frame(Com,vert)
print(intra)
}
当我尝试该功能时,它无法正常工作。例如:
当我跑步时:
G <- graph.famous("Zachary")
intra.edges(G,1)
我明白了:
Community.sizes Freq vert
1 9 6
2 7 6
3 9 6
4 4 6
5 5 6
当我运行intra.edges(G,2)
或intra.edges(G,3)
时,我得到相同的输出。
此外,并非所有网络组件都有六个顶点,它只在一个组件中。
答案 0 :(得分:1)
通过将代码更改为:
,您可以在for循环的每次迭代中将计算出的vert
值添加到数据框中
intra<-Com
for(i in 1:length(NoCom)){
M<-which(membership(Mod)==i)
sg<-induced.subgraph(G,M)
intra$vert[i]<-ecount(sg)
}
print(intra)
或者,正如@ dash2建议的那样,创建一个名为vert
的向量,并按顺序添加值:
vert<-NULL
for(i in 1:length(NoCom)){
M<-which(membership(Mod)==i)
sg<-induced.subgraph(G,M)
c.ec<-ecount(sg)
vert[i]<-c.ec
}