我想知道是否有人可以给我一些有关在给定簇的情况下编写“共享邻居分布”之类的功能的线索。我在Cytoscape NetworkAnalyzer中发现此功能对于我的研究目的非常有用。由于我要分析许多集群,因此为该工作编写脚本会很方便。欢迎使用igraph,networkx等提出建议。非常感谢你!
例如:
edgelist <- read.table(text = "
E B
E A
B D
B F
B C
A C
A F
A D")
library(igraph)
graph <- graph.data.frame(edgelist,directed=F)
plot(graph)
我们将看到如下图: enter image description here
两个节点(C,D,E,F)共享节点A和B。这是6倍。 节点A和B共享节点(C,D,E,F)。 总的来说,摘要应如下所示: enter image description here
我想知道是否有更好的解决方案,而不是编写循环(获取每个顶点的邻居并进行比较)。
答案 0 :(得分:1)
Networkx没有针对此问题的内置功能,因此您应该手动进行操作。而且,如果有的话,这些函数会在它们内部使用节点循环。因此,节点循环实际上是一个最佳或次佳的解决方案。对于您的代码,您可以使用Python defaultdicts使其更简单:
import networkx as nx
from collections import defaultdict
G = nx.Graph()
G.add_edges_from([
("E", "B"),
("E", "A"),
("B", "D"),
("B", "F"),
("B", "C"),
("A", "C"),
("A", "F"),
("A", "D")
])
snd = defaultdict(int)
for n1 in G.nodes:
for n2 in G.nodes:
len_nbrs = len(set(G.neighbors(n1)) & set(G.neighbors(n2)))
if len_nbrs:
snd[len_nbrs] += 1
snd
所以snd
看起来像这样:
defaultdict(int, {2: 16, 4: 4})
答案 1 :(得分:0)
非常感谢@vurmux提供的框架和想法。我只是调整了配对组合,以避免自我配对,重复等。然后我们得到了正确的答案。大。干杯!
import networkx as nx
from collections import defaultdict
from itertools import combinations
G = nx.Graph()
G.add_edges_from([
("E", "B"),
("E", "A"),
("B", "D"),
("B", "F"),
("B", "C"),
("A", "C"),
("A", "F"),
("A", "D")
])
snd = defaultdict(int)
l =G.nodes()
comb =combinations(l,2) # combinations('ABCD', 2) --> AB AC AD BC BD CD
for i in list(comb):
len_nbrs = len(set(G.neighbors(i[0])) & set(G.neighbors(i[1])))
if len_nbrs:
snd[len_nbrs] += 1
snd
现在我们有:
defaultdict(int, {2: 6, 4: 1})