iGraph,R - 来自二分组的子入射矩阵(不计算整个关联矩阵)

时间:2016-06-17 10:15:04

标签: r matrix sparse-matrix igraph bipartite

从两个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函数,但我不知道怎么做才能得到关联矩阵的子集(没有得到整个的子集,因为它也可能大)。你有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我不知道如果我帮你,但也许你想要

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