经常使用RI时,会收到错误消息"下标超出范围".例如:
# Load necessary libraries and data
library(igraph)
library(NetData)
data(kracknets, package = "NetData")
# Reduce dataset to nonzero edges
krack_full_nonzero_edges <- subset(krack_full_data_frame, (advice_tie > 0 | friendship_tie > 0 | reports_to_tie > 0))
# convert to graph data farme
krack_full <- graph.data.frame(krack_full_nonzero_edges)
# Set vertex attributes
for (i in V(krack_full)) {
for (j in names(attributes)) {
krack_full <- set.vertex.attribute(krack_full, j, index=i, attributes[i+1,j])
}
}
# Calculate reachability for each vertix
reachability <- function(g, m) {
reach_mat = matrix(nrow …
Run Code Online (Sandbox Code Playgroud) 我的问题很简单:我需要从边列表中创建一个邻接列表/矩阵.
我有一个边缘列表存储在csv文档中,其中column1 = node1和column2 = node2,我想将其转换为加权邻接列表或加权邻接矩阵.
更确切地说,这是数据的样子 - 数字只是节点ID:
node1,node2
551,548
510,512
548,553
505,504
510,512
552,543
512,510
512,510
551,548
548,543
543,547
543,548
548,543
548,542
Run Code Online (Sandbox Code Playgroud)
有关如何实现从此转换为加权邻接列表/矩阵的任何提示?这就是我以前决定这样做的方法,但没有成功(由Dai Shizuka提供):
dat=read.csv(file.choose(),header=TRUE) # choose an edgelist in .csv file format
el=as.matrix(dat) # coerces the data into a two-column matrix format that igraph likes
el[,1]=as.character(el[,1])
el[,2]=as.character(el[,2])
g=graph.edgelist(el,directed=FALSE) # turns the edgelist into a 'graph object'
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在使用igraph
包中的InfoMap算法在有向和非加权图(34943顶点,206366边)上执行社区检测.在图中,顶点表示网站,边表示网站之间存在超链接.
我在运行算法后遇到的一个问题是,大多数顶点都具有单个大型社区的成员资格(32920或94%).其余的顶点分散在数百个其他小型社区中.
我已经尝试了不同的nb.trials
参数设置(即50,100,现在运行500).但是,这似乎并未改变结果.
我感到相当恼怒,因为算法的运行时间非常高,所以我每次都要等待结果(没有运气!!).
非常感谢.
我是NetworkX的新手.现在,我设法将所有节点连接到此特定节点.我接下来要做的是使它具有交互性,例如能够通过使用光标拖动来使每个节点移动.我知道我必须使用matplotlib,但我不知道如何使用它.谁能帮我?
我的代码是:
import matplotlib.pyplot as plt
import networkx as nx
import itertools
d = [name of nodes]
f = [number per nodes]
for i in d:
G.add_edge('"' + i + '"',b)
pos=nx.fruchterman_reingold_layout(G, k=0.5, iterations=5)
nx.draw_networkx_nodes(G,pos,node_size=130, node_color="white")
nx.draw_networkx_edges(G,pos, width=0.2,alpha=1,edge_color='black')
nx.draw_networkx_labels(G,pos,font_size=7,font_family='sans-serif')
for i,j in itertools.izip(d,f):
nx.draw_networkx_edge_labels(G,pos, {('"' + i + '"',b):j}, font_size=7, label_pos= 0.80)
plt.axis('off')
plt.show()
Run Code Online (Sandbox Code Playgroud) 我有一个双模网络的边缘列表,类似于:
person Event
Amy football_game
Sam picnic
Bob art_show
Run Code Online (Sandbox Code Playgroud)
我想在R中对此进行分析,但看起来我尝试的一切都失败了.将其转换为单模式网络会遇到内存限制,我无法弄清楚如何在igraph或tnet中将其分析为二分.
在igraph中,bipartite.projection
给我所有FALSE
,在使用的igraph对象上
net <- graph.edgelist(myobject)
Run Code Online (Sandbox Code Playgroud)
在tnet上,我无法将igraph网转换为tnet网,当我尝试使用原始数据框时,它会因图中的重复而拒绝.
因此,以下任何一个的答案将非常感激:
bipartite.mapping
功能?很抱歉,如果这些是基本问题,但文档很少.
例:
edgelist <- read.table(text="Person Event
Amy football
Bob picnic
Sam artshow",
header=TRUE)
edgelist <- as.matrix(edgelist)
## Igraph Issues
igraph <- graph.edgelist(edgelist)
typevector <- bipartite.projection(igraph)
# gets all FALSE
edgelist2 <- get.edgelist(igraph)
typevector <- bipartite.projection(edgelist2)
# same thing
## tnet issues
tnet <- as.tnet(edgelist)
# gives error: "There are duplicate events in the edgelist" …
Run Code Online (Sandbox Code Playgroud) 我正在使用一个有121个顶点和209个边的图,我试图从这个图中删除满足两个条件的顶点:
degree(my.graph)==0
这是一个显示我想要的内容的示例.从下图:
toy.graph <- graph.formula(121-221,121-345,121-587,345-587,221-587, 490, 588)
Run Code Online (Sandbox Code Playgroud)
我想删除以0开头的度数为0的顶点.在这种情况下,我想只删除顶点588(但不是490和587).我知道如何从5开始删除顶点:
delete.vertices(toy.graph,V(toy.graph)$name
%in% grep("^5",V(toy.graph)$name,value=T))
Run Code Online (Sandbox Code Playgroud)
以及如何删除0度的顶点:
delete.vertices(toy.graph, V(toy.graph)[degree(toy.graph)==0])
Run Code Online (Sandbox Code Playgroud)
但是当我试图将这两个条件放在一起时,就是这样
delete.vertices(toy.graph, V(toy.graph)$name %in%
grep("^5",V(toy.graph)$name,value=T)
&& V(toy.graph)[degree(toy.graph)==0])
Run Code Online (Sandbox Code Playgroud)
它不起作用,我得到了完整的图表.是否有一种特殊的方法来组合多个条件来删除顶点?
谢谢!
有没有办法在使用函数cluster_louvain检测igraph中的 R社区时设置分辨率参数?它对结果有很大影响,因为该参数与节点之间的层次差异有关。谢谢你。
我正在做一个简单的任务:迭代所有顶点并根据其邻居的属性计算新属性。我搜索了 SO,到目前为止我知道至少有三种方法可以做到这一点:
然而,对于我的数据量(30 万个顶点和 800 万条边)来说,这两种方法都花费太长的时间。有没有快速循环顶点的方法?谢谢!
对于基准测试,假设我有以下示例数据:
set.seed <- 42
g <- sample_gnp(10000, 0.1)
V(g)$name <- seq_len(gorder(g)) # add a name attribute for data.table merge
V(g)$attr <- rnorm(gorder(g))
V(g)$mean <- 0 # "mean" is the attribute I want to compute
Run Code Online (Sandbox Code Playgroud)
方法1的代码是:
al <- as_adj_list(g)
attr <- V(g)$attr
V(g)$mean <- sapply(al, function(x) mean(attr[x]))
# took 28s
# most of the time is spent on creating the adj list
Run Code Online (Sandbox Code Playgroud)
方法2的代码是:
compute_mean <- function(v){
mean(neighbors(g, …
Run Code Online (Sandbox Code Playgroud) 我有一个大型 igraph 对象,几乎有 1M 个节点和 150 万条边。经过一段时间的研究后,我找不到一个对节点的邻居属性求和的过程,在这种情况下,它是一个二进制的。目前,我找到的最佳解决方案如下:
\n\nV(g)$sum = sapply( ego(g,1,V(g),mode = \'all\',mindist = 1), function(v) sum(V(G)[v]$attr) )\n
Run Code Online (Sandbox Code Playgroud)\n\n然而,12 小时后,它仍然嘎吱作响。
\n\n有什么建议么?
\n\n更新 1:让我们考虑下图
\n\nlibrary(igraph)\nG <- graph.formula(1-+2,1-+3,2-+4,2-+5,3-+6,5-+7,7-+8,8-+9,9+-7, 9-+10,\n 6-+9,1-+5,3-+9,10-+11,11-+12,11-+5,12-+4,4-+10,10-+4,11-+10)\nV(G)$attr = c(1,1,0,0,1,0,1,0,1,0,1,0)\nplot(G, vertex.label.color = "white", edge.width=E(G)$weight, layout = layout.circle(G))\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n而期望的结果应该是这样的......
\n\n sapply( ego(G,1,V(G),mode = \'all\',mindist = 1), function(v) sum(V(G)[v]$attr) )\n [1] 2 2 2 1 4 1 2 2 1 2 1 1\n
Run Code Online (Sandbox Code Playgroud)\n\n@Tam\xc3\xa1s,我尝试在不使用循环的情况下访问邻居函数,但我得到的不是上面描述的结果......
\n\nsapply(neighbors(G,V(G)),function (v) sum(V(G)[v]$attr))\n2 3 5 \n1 0 1 …
Run Code Online (Sandbox Code Playgroud) 我想在 R 中创建一个随机加权有向图。我使用erdos.renyi.game
创建一个随机有向图,但我不确定如何为已建立的连接创建权重:
library(igraph)
g01 <- erdos.renyi.game(25, 1/10, directed = TRUE)
Run Code Online (Sandbox Code Playgroud)
我如何对其进行加权?
sna ×10
r ×9
igraph ×8
large-data ×1
matplotlib ×1
matrix ×1
networkx ×1
python ×1
python-2.7 ×1