对于相同的变量,我有两个聚类结果,但每次都有不同的值。让我们用以下代码创建它们:
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.a和clus.b,它们的名称(这里只有1到100之间的数字)是每个集群的变量。
有没有任何方法来检查这些变量中的哪一个是否聚集在这两个簇中?这意味着,对于clus.a和clus.b,我如何才能看到在相同的集群中是否有变量(可以是2、3、4等的团队)(不需要在相同的集群号中)。
发布于 2015-09-20 16:57:09
如果我正确理解了您的问题,您想知道a中是否有与b中的任何集群具有完全相同成员资格的集群。有一种方法可以做到。
注意:在您的示例中,a和b中没有匹配的集群,因此我们创建了一些人工演示解决方案。
# 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正在改变问题的事实。
若要检测具有两个或多个公共元素的集群,请使用:
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
# ...确定在这两种情况下都存在哪些要素:
apply(matched,1,function(r) intersect(clus.a[[r[1]]],clus.b[[r[2]]]))https://stackoverflow.com/questions/32680815
复制相似问题