r - 根据顶点强度分配边缘方向

标签 r igraph

我有一个无向图。我想根据顶点强度假设边缘方向,因此我创建了一个有向图,其中所有边缘都指向每条边缘中较高强度的顶点。

我找到的唯一解决方案是as.directed,但这似乎只能为每个边缘分配随机方向。

例如我有一个由 5 个顶点和 6 条边组成的简单图

V(g)

+ 5/5 vertices, named, from 003341a:
[1] A B C D E
strength(g)

 A  B  C  D  E 
81 40 21 30 30  
E(g)

+ 6/6 edges from 003341a (vertex names):
[1] A--B A--C A--D A--E B--E D--E

我想根据强度设置方向性,以便方向朝向较高强度的顶点。

这是按要求的 dput(g) 的输出:

dput(g)

structure(list(5, FALSE, c(1, 2, 3, 4, 4, 4), c(0, 0, 0, 0, 1, 
3), c(0, 1, 2, 3, 4, 5), c(0, 1, 2, 3, 4, 5), c(0, 0, 1, 2, 3, 
6), c(0, 4, 5, 5, 6, 6), list(c(1, 0, 1), structure(list(), .Names = character(0)), 
    list(name = c("A", "B", "C", "D", "E")), list(weight = c(30L, 
    21L, 20L, 10L, 10L, 10L))), <environment>), class = "igraph")

这是我想要实现的方向性(但目前不知道如何实现):

E(g)

+ 6/6 edges from 003341a (vertex names):
[1] A<-B A<-C A<-D A<-E B<-E D<>E

最佳答案

有趣的问题!一种可能的解决方案是添加强度作为顶点属性,并根据相应顶点之间的差异生成新的边属性。

V(g)$strength <- strength(g)
ids <- get.edges(g, 1:ecount(g))
E(g)$weight1 <- V(g)$strength[ids[,1]] - V(g)$strength[ids[,2]]
E(g)$weight2 <- V(g)$strength[ids[,2]] - V(g)$strength[ids[,1]]

下一步是查看图的邻接矩阵:

m0 <- get.adjacency(g, sparse = F)
m0
> m0
  A B C D E
A 0 1 1 1 1
B 1 0 0 0 1
C 1 0 0 0 0
D 1 0 0 0 1
E 1 1 0 1 0

在这种情况下,我们有一个对称矩阵,它可以转换为无向图。现在的想法是删除所有连接“较弱”顶点与较强顶点的条目(代表边)。为了做到这一点,我们考虑了之前计算的边缘权重。我们对矩阵的两个“方向”(上限和下限)执行此操作。

m <- get.adjacency(g, type = "lower", attr = "weight1", sparse = F)
m1 <- get.adjacency(g, type = "upper", attr = "weight2", sparse = F)

如果我们组合矩阵,我们会得到一个同时具有正边和负边​​的矩阵。

m2 <- m1+m
> m2
   A   B   C   D   E
A  0 -41 -60 -51 -51
B 41   0   0   0 -10
C 60   0   0   0   0
D 51   0   0   0   0
E 51  10   0   0   0

由于我们只对指向强度较高的顶点的边感兴趣,因此我们删除了原始二进制邻接矩阵中的负条目。

m0[m2 < 0] <- 0
> m0
  A B C D E
A 0 0 0 0 0
B 1 0 0 0 0
C 1 0 0 0 0
D 1 0 0 0 1
E 1 1 0 1 0

我们可以从这里构建图表:

g2 <- graph_from_adjacency_matrix(m0, mode = "directed")
plot(g2)

生成的图表看起来像这样:

enter image description here


编辑我刚刚意识到您已经有了所需的边缘配对和方向。在这种情况下,您可以使用许多 igraph 函数提供的 modedirected 参数。参见示例:

?graph_from_data_frame

假设您从现有的边列表 (el) 生成图表,那么您可以简单地编写如下内容:

g2 <- graph_from_data_frame(el, directed = T)

关于r - 根据顶点强度分配边缘方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57014476/

相关文章:

string - R 从公式字符串或表达式中删除多余的括号

r - 在 R 中使用 igraph 创建子图

r - 使用 ggnet2 在 R 中按度数着色

r - 过滤行的条件是必须至少存在两个不同的关键字

r - 子集不平衡(异源复制)以完成或平衡 r 中的数据集

r - R图形图中的顶点边界颜色/宽度

python - 将图转换为出度 1(额外的零权重边除外)

networking - 如何延长 igraph 网络图中的边 (layout=fruchterman.reingold)?

r - 如何按具有所有级别因素的受试者进行筛选?

r - 显示每个方面而不是整体的摘要行