从两个data.frames df1
和df2
开始,它们之间有连接键,我最终得到一个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
其中列V
和X
标识两个二分图的组并对边进行排列。 (我为下一个添加了两列ID1
和ID2
。从这里我需要得到二分图(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列,而是直接V
和X
?
然后,对于聚类我会使用clusters
函数,但我不知道怎么做才能得到关联矩阵的子集(没有得到整个的子集,因为它也可能大)。你有什么想法吗?
答案 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