#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, если смогу! отлично ! Я бы добавил график графика, потому что действительно помогает увидеть решение!