【问题标题】:Clustering 2-element integer vectors聚类 2 元素整数向量
【发布时间】:2014-06-21 19:50:55
【问题描述】:

假设我是一组 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,其中每个元素都是所有相交向量的值。不与任何其他向量相交的向量值也应作为列表元素返回。

简单来说,这应该返回这个列表:

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

如您所见,向量 c(1,4) 不与任何其他向量相交,因此它作为单个元素列表返回。另外两个列表元素是交集。

【问题讨论】:

  • 总是只有第一列重叠?
  • 感谢您的评论。我相应地编辑了我的问题。

标签: r intersection


【解决方案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() 函数将它们划分为子组。然后我遍历每个子组并提取每个子组边缘的顶点名称。

最后xx的值是

[[1]]
[1] 1 4

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

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

所以它是一个连接值的列表。

【讨论】:

  • 如果可以的话+10!优秀的 !我会添加图表,因为确实有助于查看解决方案!
猜你喜欢
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2010-10-04
  • 2020-12-08
相关资源
最近更新 更多