获取R中的连通组件

时间:2016-03-03 12:58:40

标签: r graph-algorithm connected-components

我有一个值为0或1的矩阵,我想获得一个相邻1的组列表。

例如,矩阵

mat = rbind(c(1,0,0,0,0),
            c(1,0,0,1,0),
            c(0,0,1,0,0),
            c(0,0,0,0,0),
            c(1,1,1,1,1))

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

应返回以下4个连接组件:

C1 = {(1,1);(2,1)}

C2 = {(2,4)}

C3 = {(3,3)}

C4 = {(5,1);(5,2);(5,3);(5,4);(5,5)}

有人知道如何在R中快速完成吗?我的真实矩阵确实相当大,如2000x2000(但我希望连接组件的数量相当小,即200)。

1 个答案:

答案 0 :(得分:7)

通过更新,您可以将二进制矩阵转换为栅格对象并使用 clumps 功能。然后只是数据管理才能返回您想要的确切格式。示例如下:

library(igraph)
library(raster)

mat = rbind(c(1,0,0,0,0),
            c(1,0,0,1,0),
            c(0,0,1,0,0),
            c(0,0,0,0,0),
            c(1,1,1,1,1))
Rmat <- raster(mat)
Clumps <- as.matrix(clump(Rmat, directions=4))

#turn the clumps into a list
tot <- max(Clumps, na.rm=TRUE)
res <- vector("list",tot)
for (i in 1:tot){
  res[i] <- list(which(Clumps == i, arr.ind = TRUE))
}

然后在控制台打印出res

> res
[[1]]
     row col
[1,]   1   1
[2,]   2   1

[[2]]
     row col
[1,]   2   4

[[3]]
     row col
[1,]   3   3

[[4]]
     row col
[1,]   5   1
[2,]   5   2
[3,]   5   3
[4,]   5   4
[5,]   5   5

如果有更好的方法从光栅对象到最终目标,我不会感到惊讶。同样,2000年到2000年的矩阵对此不应该是一个大问题。

旧(错误答案),但对于想要图表的连接组件的人来说应该是有用的。

您可以使用igraph包将您的邻接矩阵转换为网络并返回组件。您的示例图是一个组件,因此我删除了一条边以进行说明。

library(igraph)
mat = rbind(c(1,0,0,0,0),
            c(1,0,0,1,0),
            c(0,0,1,0,0),
            c(0,0,0,0,0),
            c(1,1,1,1,1))
g  <- graph.adjacency(mat) %>% delete_edges("5|3")
plot(g)
clu <- components(g)
groups(clu)

最后一行然后在提示符处返回:

> groups(clu)
$`1`
[1] 1 2 4 5

$`2`
[1] 3

我使用这个算法的经验非常快 - 所以我认为2,000比2000不会成为问题。