С обновлением вы можете превратить вашу двоичную матрицу в растровый объект и использовать функцию 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:max(Clumps, na.rm=TRUE)){
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
Мой опыт работы с этим алгоритмом он довольно быстро - так что я не думаю, что 2000 на 2000 будет проблемой.
Благодарим вас за ответ, но моя матрица не является матрицей смежности: она не представляет собой график. Я хотел бы найти группы сгруппированных (то есть в матрице). – user3771535
Ahh sorry - 'связанные компоненты' - это термин, который уже используется для того, что я описал. Похоже, растровый пакет имеет функцию с именем 'clump', которая делает то, что вы хотите. Я посмотрю, смогу ли я поднять пример. –
Большое спасибо, он работает очень хорошо! – user3771535