首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚类2元整数向量

聚类2元整数向量
EN

Stack Overflow用户
提问于 2014-06-21 19:50:55
回答 1查看 110关注 0票数 2

假设我是一组2元素的整数向量,例如,这个矩阵中的每一行:

代码语言:javascript
复制
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

或者另一种选择是:

代码语言:javascript
复制
my.list = list(c(1,4), c(2,5), c(7,2), c(3,6), c(3,8))

我正在寻找一个函数,它将这些向量相互交叉,并返回一个list,其中每个元素都是所有相交向量的值。不与任何其他向量相交的向量的值也应作为列表元素返回。

简单地说,这应该返回以下列表:

代码语言:javascript
复制
list(c(1,4), c(2,5,7,2), c(3,6,3,8))

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-21 20:31:12

对于这种类型的问题,我喜欢使用igraph包,因为很容易将行看作图中的边,并且您正在查找所有连接的块。

代码语言:javascript
复制
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的值将是

代码语言:javascript
复制
[[1]]
[1] 1 4

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24345304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档