我正在使用iGraph库,我需要在网络上运行一些统计分析.我正在使用iGraph计算几个变量,然后想要将这些指标用作几个回归中的因变量,将顶点属性用作模型中的自变量.
所以,我能够加载数据,运行igraph分析,但是我无法将igraph对象转回数据框.我真的不需要保留边缘,只需将每个顶点转换为观察结果,每个行中的属性作为列.
我尝试了以下方法:
fg <- fastgreedy.community(uncompg, merges=TRUE)
z<-which.max(fg$modularity)
fgc<- community.to.membership(uncompg, fg$merges,z)
names<-array(V(uncompg)$name)
fccommunity<-array(fgc$membership)
fcresult<-as.matrix(cbind(names,fccommunity))
compg <- set.vertex.attribute(compg, "community", value=fccommunity)
uncompg<-simplify(as.undirected(compg))
hubscore<-hub.score(compg)$vector
authscore<-authority.score(compg)$vector
netdata<-as.data.frame(compg)
Run Code Online (Sandbox Code Playgroud)
但它会引发以下错误:
cannot coerce class '"igraph"' into a data.frame
Run Code Online (Sandbox Code Playgroud)
任何帮助或指针将不胜感激.
我有一个data.table:
groups <- data.table(group = c("A", "B", "C", "D", "E", "F", "G"),
code_1 = c(2,2,2,7,8,NA,5),
code_2 = c(NA,3,NA,3,NA,NA,2),
code_3 = c(4,1,1,4,4,1,8))
group code_1 code_2 code_3
A 2 NA 4
B 2 3 1
C 2 NA 1
D 7 3 4
E 8 NA 4
F NA NA 1
G 5 2 8
Run Code Online (Sandbox Code Playgroud)
我想要实现的是让每个组根据可用代码找到直接邻居。例如:A 组由于 code_1 具有直接邻居组 B、C(code_1 在所有组中等于 2)并且由于 code_3 具有直接邻居组 D、E(在所有这些组中 code_3 等于 4)。
我尝试的是针对每个代码,根据匹配对第一列(组)进行子集化,如下所示:
groups$code_1_match = list()
for (row in 1:nrow(groups)){
set(groups, i=row, j="code_1_match", list(groups$group[groups$code_1[row] …Run Code Online (Sandbox Code Playgroud) 关系parent-child数据框如下:
parent_id child_id
1 1 2
2 2 3
3 3 4
Run Code Online (Sandbox Code Playgroud)
目标是实现以下目标,即先前数据框的扩展版本,其中所有后代(子代、孙子等)都分配给每个父代(包括父代/子代本身):
parent_id child_id
1 1 1
2 1 2
3 1 3
4 1 4
5 2 2
6 2 3
7 2 4
8 3 3
9 3 4
10 4 4
Run Code Online (Sandbox Code Playgroud)
我的问题是:在 R 中实现这一目标的最快方法(或其中之一)是什么?
我已经尝试过各种方法 - 从 for 循环、SQL 递归到使用igraph(如此处所述)。它们都相当慢,并且其中一些在处理大量组合时还容易崩溃。
sqldf下面是和 的示例igraph,在比上面稍大的数据帧上进行基准测试。
library(sqldf)
library(purrr)
library(dplyr)
library(igraph)
df <- data.frame(parent_id = 1:1000L)
df$child_id <- df$parent_id + 1L …Run Code Online (Sandbox Code Playgroud) 虽然手册指出这将是未来的功能:
arrow.size箭头的大小.目前这是一个常数,所以每个边缘都是一样的.如果提交了一个向量,那么只使用第一个元素,即.如果这是从边缘属性获取的,那么只有第一条边的属性用于所有箭头.这可能会在未来发生变化.
默认值为1.
我想知道是否有一个黑客围绕允许箭头大小匹配边缘宽度(每个边缘有自己的宽度).
d <- data.frame(start=c("a","a","b","c"),end=c("b","b","c","b"), size=rnorm(4))
graph <- graph.data.frame(d, directed=T)
plot(graph,
vertex.color="white",
edge.width=E(graph)$size*20,
edge.arrow.size=E(graph)$size)
Run Code Online (Sandbox Code Playgroud)

我正在研究网络中的检测社区.
我用的是igraph和Python
对于模块化度量方面的最佳社区数量:
from igraph import *
karate = Nexus.get("karate")
cl = karate.community_fastgreedy()
cl.as_clustering().membership
Run Code Online (Sandbox Code Playgroud)
为供应所需数量的社区:
from igraph import *
karate = Nexus.get("karate")
cl = karate.community_fastgreedy()
k=2
cl.as_clustering(k).membership
Run Code Online (Sandbox Code Playgroud)
但是,我喜欢使用networkx这样做.我知道在模块化度量方面获得最佳社区数量:
import community # --> http://perso.crans.org/aynaud/communities/
import fastcommunity as fg # --> https://networkx.lanl.gov/trac/ticket/245
import networkx as nx
g = nx.karate_club_graph()
partition = community.best_partition(g)
print "Louvain Modularity: ", community.modularity(partition, g)
print "Louvain Partition: ", partition
cl = fg.communityStructureNewman(g)
print "Fastgreed Modularity: ", cl[0]
print "Fastgreed Partition: ", cl[1]
Run Code Online (Sandbox Code Playgroud)
但我无法获得所需数量的社区.使用Networkx有一些算法吗?
我想更改图表的边缘宽度以对应edge.betweenness得分.
net <- read.csv("D:/SNA/R/Net.csv")
att <- read.csv("D:/SNA/R/Att.csv")
g <- graph.data.frame(net, vertices=att, directed=TRUE)
pdf("Network.pdf", pointsize=8)
plot(g, vertex.label=NA, vertex.size=3, edge.width=edge.betweenness(g))
dev.off()
Run Code Online (Sandbox Code Playgroud)
我还尝试将边缘间度分数创建为边缘权重,并将其分配给plot函数中的edge.width参数,如下所示;
plot(g, vertex.label=NA, vertex.size=3, edge.width=E(g)$width
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用igraph来实现Kou算法来识别R中的Steiner树.
Kou的算法可以这样描述:
前两个步骤很简单:
g <- erdos.renyi.game(100, 1/10) # graph
V(g)$name <- 1:100
# Some steiner nodes
steiner.points <- sample(1:100, 5)
# Complete distance graph G'
Gi <- graph.full(5)
V(Gi)$name <- steiner.points
# Find a minimum spanning tree T' in G'
mst <- minimum.spanning.tree(Gi)
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何用G'中的最短路径替换T'中的边缘.我知道get.shortest.paths我可以vpath从一对节点获取,但是我如何用shortest.pathG 中的T'替换和边缘?
提前谢谢了
我正在尝试使用igraph和实现单变量网络数据的分类工具包python.
但是,我的问题实际上更多的是关系分类领域的算法问题,而不是编程.
我很难理解本文所指的" 网络唯一贝叶斯分类器 "(NBC),它是本文中解释的关系分类器之一.
我之前Naive Bayes使用单词包特征表示实现了文本数据的分类器.Naive Bayes关于文本数据的想法在我的脑海中清晰可见.
我认为这种方法(NBC)是将相同的想法简单地翻译成关系分类区域.但是,我对方程中使用的符号感到困惑,所以我无法弄清楚发生了什么.我也有在纸中使用的符号的一个问题在这里.
NBC 在论文的第14页有解释,

摘要:
我需要在第14页的论文中解释的" 仅网络贝叶斯分类器 "(NBC)的伪代码.
伪码表示法:
vs图中的顶点列表.len(vs)是长度.vs[i]是第i个顶点.vs[i].class或者是0或者1没有节点的其他给定特征.v我们试图预测v.neighbors()的顶点,并且是邻居的顶点列表v.1.现在,我需要伪代码:
def NBC(vs, v):
# v.class is 0 or 1
# v.neighbors is list of neighbor vertices
# vs is the …Run Code Online (Sandbox Code Playgroud) 先前的回答另一个问题提供了一些代码来重新连接一个加权图如下:
g <- graph.ring(10)
E(g)$weight <- seq_len(ecount(g))
E(g)$weight
# [1] 1 2 3 4 5 6 7 8 9 10
is.weighted(g)
# [1] TRUE
g2 <- rewire(g,niter=3)
plot(g2)
is.weighted(g2)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
但是,使用此代码可以看出NAs被引入到边权重向量中:
set.seed(1)
g <- graph.ring(10)
E(g)$weight <- seq_len(ecount(g))
E(g)$weight
# [1] 1 2 3 4 5 6 7 8 9 10
is.weighted(g)
# [1] TRUE
g2 <- rewire(g,niter=3)
E(g2)$weight
# [1] 1 2 4 5 6 7 9 NA NA NA
is.weighted(g2)
# [1] …Run Code Online (Sandbox Code Playgroud) 我在R中使用igraph包.
我想将一些数据与每个顶点相关联,例如通过向每个顶点添加id和description属性.属性在运行时确定.关于如何设置和获取此数据,我有几个相关的问题.
要设置顶点的id我使用(where g是图形):
> set.vertex.attribute(g,'id',1,'first_id') # etc
Run Code Online (Sandbox Code Playgroud)
我希望能够通过以下方式读取属性:
> get.vertex.attribute(g,'id',1)
Run Code Online (Sandbox Code Playgroud)
但是这会返回NULL.难道我做错了什么?
此外,具有该get.vertex.attribute调用的函数不能访问属性名称列表.如何从图表中提取属性名称g?
最后,我想从/到命名列表中设置/获取属性的值.是否有一种简单的方法可以在不循环遍历每个顶点和属性并应用set.- 或get.vertex.attribute?
谢谢!
igraph ×10
r ×8
algorithm ×1
data.table ×1
graph ×1
graph-theory ×1
modularity ×1
naivebayes ×1
networkx ×1
performance ×1
plot ×1
pseudocode ×1
python ×1
recursion ×1
statistics ×1