【问题标题】:iGraph, R - sub-incidence matrices from bipartite groups (without computing entire incidence matrix)iGraph, R - 来自二分组的子关联矩阵(不计算整个关联矩阵)
【发布时间】:2026-01-07 20:20:04
【问题描述】:

从两个 data.frames df1df2 开始,它们之间有连接键,我最终得到一个如下所示的 data.frame

# df3
#        V    ID1    X     ID2
# 1     V1    1      X2    12
# 2     V2    2      X1    11
# 3     V2    2      X2    12
# 4     V3    3      X2    12
# 5     V2    2      X3    13
# 6     V4    4      X3    13
# 7     V5    5      X4    14
# 8     V6    6      X4    14
# 9     V7    7      X5    15
# 10    V8    8      X5    15
# 11    V9    9      X5    15
# 12    V8    8      X6    16
# 13   V10    10     X6    16

其中列VX 标识二分图的两组并将边排成行。 (我为下一个添加两列ID1ID2)从这里我需要得到二分图(BG)作为中间步骤,然后是所有簇的关联矩阵(最大独立顶点)。

为了获得BG,我会使用

df4 <- subset(df3, select=c("ID1","ID2"))
bg <- make_bipartite_graph(c(rep(0,nrow(df1)),rep(1,now(df2))), c(t(df4)))

第一个问题,有没有其他更聪明的方法可以从我的 data.frame 中获取二分图而不使用 ID 列,而是直接使用 VX

然后,对于集群,我将使用 clusters 函数,但我不知道该怎么做才能获得关联矩阵的子集(没有获得整个矩阵,因为它可能太大了) .你有什么想法吗?

【问题讨论】:

    标签: r matrix sparse-matrix igraph bipartite


    【解决方案1】:

    我不知道我是否正确,但也许你想要

    library(igraph)
    df <- df3[, c(1, 3)]
    g <- graph_from_data_frame(df)
    V(g)$type <- substr(V(g)$name, 1, 1)=="V"
    plot(as.undirected(g), layout=layout.bipartite(g)[, 2:1])
    

    gs <- decompose(g)
    lapply(gs, as_incidence_matrix)
    # [[1]]
    #    V1 V2 V3 V4
    # X2  1  1  1  0
    # X1  0  1  0  0
    # X3  0  1  0  1
    # 
    # [[2]]
    #    V5 V6
    # X4  1  1
    # 
    # [[3]]
    #    V7 V8 V9 V10
    # X5  1  1  1   0
    # X6  0  1  0   1
    

    【讨论】:

    • 正是这个!非常感谢,对不起,我重新阅读了我的帖子,老实说,我不知道你是怎么理解我的意思的! :)