Кластеризация 2-элементных целых векторов

#r #intersection

#r #пересечение

Вопрос:

Предположим, я группа 2-элементных целочисленных векторов, например, каждая строка в этой матрице:

 my.mat = matrix(data = c(1,4,2,5,7,2,3,6,3,8), ncol = 2, byrow=T)
> my.mat
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    7    2
[4,]    3    6
[5,]    3    8
  

или, альтернативно, этот список:

 my.list = list(c(1,4), c(2,5), c(7,2), c(3,6), c(3,8))
  

Я ищу функцию, которая будет пересекать эти векторы друг с другом и возвращать a list , где каждый элемент представляет собой значения всех пересекающихся векторов. Значения векторов, которые не пересекаются ни с каким другим вектором, также должны быть возвращены в виде элемента списка.

Проще говоря, это должно вернуть этот список:

 list(c(1,4), c(2,5,7,2), c(3,6,3,8))
  

Как вы можете видеть, вектор c(1,4) не пересекается ни с каким другим вектором и поэтому возвращается в виде списка с одним элементом. Два других элемента списка имеют пересечения.

Комментарии:

1. Это всегда только первый столбец, который перекрывается?

2. Спасибо за комментарий. Я соответствующим образом отредактировал свой вопрос.

Ответ №1:

Мне нравится использовать igraph пакет для решения задач такого типа, потому что легко представить строки как ребра в графе, и вы ищете все связанные фрагменты.

 my.mat = matrix(data = c(1,4,2,5,7,2,3,6,3,8), ncol = 2, byrow=T)

library(igraph)
class(my.mat)<-"character"
gg <- graph.edgelist(my.mat, directed=T)
vset <- clusters(gg)$membership

xx<-sapply(unique(vset), function(s) {
    es <- E(gg)[from(V(gg)[vset==s])]
    as.numeric(V(gg)[t(get.edges(gg,es))]$name)
})
  

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

введите описание изображения здесь

Затем clusters() функция then разбивает их на подгруппы. Затем я просматриваю каждую подгруппу и извлекаю имена вершин в ребрах каждой подгруппы.

В конце концов, значение xx будет

 [[1]]
[1] 1 4

[[2]]
[1] 2 5 7 2

[[3]]
[1] 3 6 3 8
  

итак, это список связанных значений.

Комментарии:

1. 10, если смогу! отлично ! Я бы добавил график графика, потому что действительно помогает увидеть решение!