使用邻接矩阵对边进行计数

Count edges using the adjacency matrix

基于邻接矩阵,我想计算网络中唯一边的数量。在下面的示例中,我对不同节点之间的独特边缘进行了着色。但是我不知道如何进行。

期望的输出:

示例数据

structure(list(...1 = c("m1", "m2", "m3", "m4"), m1 = c(0.2, 
0.2, 0.2, 0.3), m2 = c(0.1, 0.2, 0.2, 0.6), m3 = c(0.5, 0.2, 
1, 0), m4 = c(0.3, 0, 0, 0.1)), row.names = c(NA, -4L), spec = structure(list(
    cols = list(...1 = structure(list(), class = c("collector_character", 
    "collector")), m1 = structure(list(), class = c("collector_double", 
    "collector")), m2 = structure(list(), class = c("collector_double", 
    "collector")), m3 = structure(list(), class = c("collector_double", 
    "collector")), m4 = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), delim = ","), class = "col_spec"),  class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"))

假设这是一个无向图,0 表示没有边,正数表示有边,将输入 DF 转换为逻辑矩阵,然后将其转换为 igraph 对象。然后获取它的边和这些边的名称。 (另一种可能的输出是使用 as_edgelist(g) 得到一个 2 列矩阵,这样每行定义一条边。)

如果打算使图形是有向的,则将“无向”替换为“有向”,在这种情况下,将生成一个包含 13 个边名称的字符向量,而不是下面所示的 9 个无向边。

library(igraph)

m <- as.matrix(DF[-1])
rownames(m) <- colnames(m)

g <- graph_from_adjacency_matrix(m > 0, "undirected")
e <- E(g)

attr(e, "vnames")
## [1] "m1|m1" "m1|m2" "m1|m3" "m1|m4" "m2|m2" "m2|m3" "m2|m4" "m3|m3" "m4|m4"

交替作为管道

library(igraph)
library(tibble)

DF %>%
  column_to_rownames("...1") %>%
  as.matrix %>%
  sign %>%
  graph_from_adjacency_matrix("undirected") %>%
  E %>%
  attr("vnames")
## [1] "m1|m1" "m1|m2" "m1|m3" "m1|m4" "m2|m2" "m2|m3" "m2|m4" "m3|m3" "m4|m4"

g 的图形如下所示。 (如果上面选择了“定向”,那么边缘上会有箭头。)

set.seed(123)
plot(g)

备注

DF <-
structure(list(...1 = c("m1", "m2", "m3", "m4"), m1 = c(0.2, 
0.2, 0.2, 0.3), m2 = c(0.1, 0.2, 0.2, 0.6), m3 = c(0.5, 0.2, 
1, 0), m4 = c(0.3, 0, 0, 0.1)), row.names = c(NA, -4L), spec = structure(list(
    cols = list(...1 = structure(list(), class = c("collector_character", 
    "collector")), m1 = structure(list(), class = c("collector_double", 
    "collector")), m2 = structure(list(), class = c("collector_double", 
    "collector")), m3 = structure(list(), class = c("collector_double", 
    "collector")), m4 = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), delim = ","), class = "col_spec"),  class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"))