假设我有一组 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))
我正在寻找一个函数,它将这些向量彼此相交并返回一个列表
,其中每个元素都是所有相交向量的值。不与任何其他向量相交的向量值也应作为列表元素返回。
简单来说,这应该返回这个列表:
list(c(1,4), c(2,5,7,2), c(3,6,3,8))
如您所见,向量 c(1,4) 不与任何其他向量相交,因此它作为单个元素列表返回。另外两个列表元素是交集。
最佳答案
我喜欢使用 igraph
包来解决此类问题,因为很容易将行视为图中的边,并且您正在寻找所有连接的 block 。
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()
函数将它们划分为子组。然后我遍历每个子组并提取每个子组边缘的顶点名称。
最终xx
的值为
[[1]]
[1] 1 4
[[2]]
[1] 2 5 7 2
[[3]]
[1] 3 6 3 8
所以它是一个连接值的列表。
关于r - 聚类 2 元素整数向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24345304/