首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中簇对象的比较

R中簇对象的比较
EN

Stack Overflow用户
提问于 2015-09-20 15:04:22
回答 1查看 1.3K关注 0票数 0

对于相同的变量,我有两个聚类结果,但每次都有不同的值。让我们用以下代码创建它们:

代码语言:javascript
复制
set.seed(11)
a<-matrix(rnorm(10000),ncol=100)
colnames(a)<-(c(1:100))
set.seed(31)
b<-matrix(rnorm(10000),ncol=100)
colnames(b)<-colnames(a)
c.a<-hclust(dist(t(a)))
c.b<-hclust(dist(t(b)))
# clusters
groups.a<-cutree(c.a, k=15)
# take groups names
clus.a=list()
for (i in 1:15) clus.a[[i]] <- colnames(a)[groups.a==i]
# see the clusters 
clus.a
groups.b<-cutree(c.b, k=15)
clus.b=list()
for (i in 1:15) clus.b[[i]] <- colnames(b)[groups.b==i]
# see the clusters
clus.b

我从中得到的是两个列表,clus.aclus.b,它们的名称(这里只有1到100之间的数字)是每个集群的变量。

有没有任何方法来检查这些变量中的哪一个是否聚集在这两个簇中?这意味着,对于clus.aclus.b,我如何才能看到在相同的集群中是否有变量(可以是2、3、4等的团队)(不需要在相同的集群号中)。

EN

回答 1

Stack Overflow用户

发布于 2015-09-20 16:57:09

如果我正确理解了您的问题,您想知道a中是否有与b中的任何集群具有完全相同成员资格的集群。有一种方法可以做到。

注意:在您的示例中,ab中没有匹配的集群,因此我们创建了一些人工演示解决方案。

代码语言:javascript
复制
# create artificial matches
clus.b[[3]]  <- clus.a[[2]]
clus.b[[10]] <- clus.a[[8]]
clus.b[[15]] <- clus.a[[11]]

f <- function(a,b) (length(a)==length(b) & length(intersect(a,b))==length(a))
result <- sapply(clus.b,function(x)sapply(clus.a,f,b=x))
which(result, arr.ind=TRUE)
#      row col
# [1,]   2   3
# [2,]   8  10
# [3,]  11  15

因此,这个循环遍历b (sapply(clus.b,...))中的所有集群,对于每个集群,循环遍历a中的所有集群,寻找完全匹配的(任意顺序)。为了进行匹配,两个集群必须具有相同的长度,而两个集群的交集必须包含其中的所有元素,因此具有相同的长度。此过程生成一个逻辑矩阵,其中行表示a,列表示b

编辑:以反映OP正在改变问题的事实。

若要检测具有两个或多个公共元素的集群,请使用:

代码语言:javascript
复制
f <- function(a,b) length(intersect(a,b))>1
result <- sapply(clus.b,function(x)sapply(clus.a,f,b=x))
matched <- which(result, arr.ind=TRUE)
matched
#       row col
#  [1,]   4   1
#  [2,]   8   1
#  [3,]  11   1
#  [4,]   3   2
#  ...

确定在这两种情况下都存在哪些要素:

代码语言:javascript
复制
apply(matched,1,function(r) intersect(clus.a[[r[1]]],clus.b[[r[2]]]))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32680815

复制
相关文章

相似问题

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