Нахождение взаимосвязанных соседей в 2d матрице - PullRequest
1 голос
/ 23 января 2020

У меня похожая матрица, как показано ниже

  a| b | c | d | e 
1|1| 0 | 0 | 1 | 0
2|0| 0 | 1 | 0 | 1
3|0| 1 | 0 | 0 | 0
4|0| 1 | 0 | 1 | 0
5|0| 1 | 0 | 0 | 0
6|1| 0 | 0 | 0 | 0

Я хочу получить соседей для каждой буквы. Соседи определены следующим образом, например, «a» и «d» равны 1 для строки 1, следовательно, они являются соседями, теперь «d» равно 1 для строки 1 и 4, поэтому любая буква, равная 1 для строки 4, будет соседней для «d» также как и". Здесь "b" равно 1 для строки 4 и, следовательно, будет соседом для ботов "a" и "d". И так далее ...

вывод должен быть

   a    | b     |  c    |  d    |  e 
   3    | 3     |  2    |  3    |  2
 abd    |abd    |     ce|    abd|     ce
 1,3,4,6|1,3,4,6|    2,5|1,3,4,6|    2,5

, где вторые строки указывают количество соседей (включая сам алфавит). третья строка сообщает соседям четвертая строка сообщает имени строки, соединяющей этих соседей

1 Ответ

1 голос
/ 23 января 2020

Как упомянуто @Sotos в комментариях, вы можете использовать пакет igraph для визуализации матрицы, а код ниже просто, чтобы дать вам некоторое представление о том, как сделать ее

library(igraph)
M <- crossprod(m)
g <- graph_from_adjacency_matrix(M,mode = "undirected")
plot(g)

, и вы Посмотрите, как вершины связаны. enter image description here

Тогда ожидаемый результат (кроме последней строки, поскольку я понятия не имею, как вы его получили) может быть достигнут следующим образом:

r <- clusters(g)

vtx <- names(r$membership)
len <- ave(seq(r$membership),r$membership,FUN = length)
cnm <- ave(vtx,r$membership,FUN = function(x) paste0(x,collapse = ","))

dfout <- setNames(as.data.frame(rbind(len,cnm)),vtx)

такой, что

> dfout
        a     b   c     d   e
len     3     3   2     3   2
cnm a,b,d a,b,d c,e a,b,d c,e

ПРИМЕЧАНИЕ

Я думаю, что ваш вопрос может быть для кластеризации (не соседние), поэтому вы можете использовать команды, как показано ниже:

> cluster_infomap(g)
IGRAPH clustering infomap, groups: 2, mod: 0.38
+ groups:
  $`1`
  [1] "a" "b" "d"

  $`2`
  [1] "c" "e"

или

> clusters(g)
$membership
a b c d e 
1 1 2 1 2 

$csize
[1] 3 2

$no
[1] 2

ДАННЫЕ

m <- structure(c(1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
0L), .Dim = 6:5, .Dimnames = list(c("1", "2", "3", "4", "5", 
"6"), c("a", "b", "c", "d", "e")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...