标签: igraph

将igraph对象转换为R中的数据框

我正在使用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)

任何帮助或指针将不胜感激.

statistics r igraph

14
推荐指数
1
解决办法
1万
查看次数

使用数据表或 igraph 按组查找直接邻居

我有一个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)

r igraph data.table

14
推荐指数
4
解决办法
512
查看次数

获取父代所有后代的快速方法

关系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)

recursion performance r graph-theory igraph

14
推荐指数
2
解决办法
1011
查看次数

允许R igraph中的箭头大小匹配边缘宽度的黑客

虽然手册指出这将是未来的功能:

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)

在此输入图像描述

plot r igraph

13
推荐指数
1
解决办法
1万
查看次数

Networkx中的社区检测

我正在研究网络中的检测社区.

我用的是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有一些算法吗?

python modularity igraph networkx

13
推荐指数
1
解决办法
2万
查看次数

根据边缘属性更改igraph图R中的边缘厚度

我想更改图表的边缘宽度以对应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)

r igraph

13
推荐指数
1
解决办法
2万
查看次数

Kou使用igraph找到Steiner树的算法

我正在尝试使用igraph来实现Kou算法来识别R中的Steiner树.

Kou的算法可以这样描述:

  1. 找到完整的距离图G'(G'有V'= S(steiner节点),对于VxV中的每对节点(u,v),有一条边的权重等于最小成本路径的权重这些节点p_(u,v)在G)
  2. 找到G'中的最小生成树T'
  3. 通过用T'的每个边来代替构造G的子图Gs,这是G'的边缘,具有相应的G的最短路径(它有几个最短的路径,选择任意一个).
  4. 找到Gs的最小生成树Ts(如果有几个最小的生成树,则选择任意一个)
  5. 如果需要,通过删除Ts中的边来构造一个Steiner树Th,从Th中的所有叶子都是Steiner节点.

前两个步骤很简单:

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'替换和边缘?

提前谢谢了

r igraph

13
推荐指数
1
解决办法
1188
查看次数

仅网络贝叶斯分类器的伪代码

我正在尝试使用igraph和实现单变量网络数据的分类工具包python.

但是,我的问题实际上更多的是关系分类领域的算法问题,而不是编程.

我正在关注网络数据文件中的分类.

我很难理解本文所指的" 网络唯一贝叶斯分类器 "(NBC),它是本文中解释的关系分类器之一.

我之前Naive Bayes使用单词包特征表示实现了文本数据的分类器.Naive Bayes关于文本数据的想法在我的脑海中清晰可见.

我认为这种方法(NBC)是将相同的想法简单地翻译成关系分类区域.但是,我对方程中使用的符号感到困惑,所以我无法弄清楚发生了什么.我也有在纸中使用的符号的一个问题在这里.

NBC 在论文的第14页有解释,

在此输入图像描述

摘要:

我需要在第14页的论文中解释的" 仅网络贝叶斯分类器 "(NBC)的伪代码.

伪码表示法:

  1. 让我们调用vs图中的顶点列表.len(vs)是长度.vs[i]是第i个顶点.
  2. 假设我们有一个单变量和二元情形,即,vs[i].class或者是0或者1没有节点的其他给定特征.
  3. 假设我们之前运行本地分类器,以便每个节点都有一个初始标签,由本地分类器计算.我只对关系分类器部分感兴趣.
  4. 让我们调用v我们试图预测v.neighbors()的顶点,并且是邻居的顶点列表v.
  5. 我们假设所有的边权重都是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)

algorithm pseudocode igraph graph-algorithm naivebayes

13
推荐指数
1
解决办法
2006
查看次数

重新连线加权图会产生NA

先前的回答另一个问题提供了一些代码来重新连接一个加权图如下:

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 graph igraph

13
推荐指数
1
解决办法
274
查看次数

如何在R中列出所有图形顶点属性?

我在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

谢谢!

r igraph

12
推荐指数
2
解决办法
1万
查看次数