将二进制矩阵转换为分组

4
这是一个看似简单的问题,但我无法想出答案。以下是最简单的情况:
考虑以下矩阵:
friendMatrix  <- matrix(c(1,1,0,0,0,     
                          1,1,1,0,0,
                          0,1,1,0,0,
                          0,0,0,1,1,
                          0,0,0,1,1),nrow=5)

它的外观如下所示

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    0    0    0 
[2,]    1    1    1    0    0
[3,]    0    1    1    0    0
[4,]    0    0    0    1    1
[5,]    0    0    0    1    1

我想使用这个矩阵来识别朋友群组,其中1表示友谊。群组是基于群组内的任何连接形成的,而不仅仅是一度关系(也就是说,1是2的朋友,2是3的朋友但不是1的朋友,但他们都在同一个群组中)。如果一行只与自身相关,则它是自己的群组。我想创建一个数据框,指示这些群组的成员资格(使用行号作为ID)(数字作为ID也可以,我只是用字母避免混淆)。对于这个例子,如下所示:
row  group
 1    A
 2    A
 3    A
 4    B
 5    B

我考虑过一些聚类算法,但是在这里似乎有点杀鸡焉用牛刀,因为这些组已经很明确定义并且显而易见。

4个回答

6
使用 igraph 创建图形,并通过对生成的图形的连通组件进行分组来创建聚类:
library(igraph)
g1 <- graph.adjacency( friendMatrix )
cl <- clusters(g1)$mem
## Display the clusters in a data.frame as OP excpeted
data.frame(row=seq_along(cl),group=LETTERS[cl])

   row group
1   1     A
2   2     A
3   3     A
4   4     B
5   5     B

回答了我的问题,并向我介绍了一个非常有用的软件包。 - Jesse Anderson
1
这个解决方案有Python版本吗? - zh1

3

适应几年前类似问题的我的答案,您可以使用RBGL包来识别您需要的“连接组件”:

library(RBGL)
m <- which(friendMatrix==1, arr.ind=TRUE)
g <- ftM2graphNEL(m)
cc <- connectedComp(g)
names(cc) <- LETTERS[seq_along(cc)]
ld <- lapply(seq_along(cc), 
             function(i) data.frame(row = cc[[i]], group = names(cc)[i]))
do.call(rbind, ld)
#   row group
# 1   1     A
# 2   2     A
# 3   3     A
# 4   4     B
# 5   5     B

以下是一种基于igraph的解决方案,供参考:请点击这里


3
这里还有另一种选择:
library(igraph)
g <- graph.adjacency(friendMatrix, "undirected")
(group <- clusters(g)$membership)
# [1] 1 1 1 2 2
V(g)$color <- group + 1
plot(g)

enter image description here


2
以下内容将帮助您可视化关系网络,我们仍在努力提取群组。
require(networkD3)
require(reshape2)

melted <- melt(friendMatrix)
relationships <- subset(melted, value == 1)
relationships
#    Var1 Var2 value
# 1     1    1     1
# 2     2    1     1
# 6     1    2     1
# 7     2    2     1
# 8     3    2     1
# 12    2    3     1
# 13    3    3     1
# 19    4    4     1
# 20    5    4     1
# 24    4    5     1
# 25    5    5     1

simpleNetwork(relationships)

Network


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接