-1

我想将我的数据聚类为 5 个聚类,然后我们需要从所有数据中选择 50 个关系最不相似的个体。这意味着如果集群一个包含 100,两个包含 200,三个包含 400,四个包含 200,五个 100,我必须从第一个集群中选择 5 + 从第二个集群中选择 10 + 从第三个集群中选择 20 + 从第四个中选择 10 + 5 从第五。

数据示例:

     mydata<-matrix(nrow=100,ncol=10,rnorm(1000, mean = 0, sd = 1))

到目前为止,我所做的是对数据进行聚类并对每个聚类中的个体进行排名,然后将其导出到 Excel 并从那里开始……这已经成为一个问题,因为我的数据变得非常大。

对于如何在 R 中应用之前的任何帮助或建议,我将不胜感激。

4

2 回答 2

2

我不确定它是否正是您正在搜索的内容,但也许它会有所帮助:

mydata<-matrix(nrow=100, ncol=10, rnorm(1000, mean = 0, sd = 1))
rownames(mydata) <- paste0("id", 1:100) # some id for identification


# cluster objects and calculate dissimilarity matrix
cl <- cutree(hclust(
  sim <- dist(mydata, diag = TRUE, upper=TRUE)), 5) 

# combine results, take sum to aggregate dissimilarity
res <- data.frame(id=rownames(mydata),
                  cluster=cl, dis_sim=rowSums(as.matrix(sim)))
# order, lowest overall dissimilarity will be first
res <- res[order(res$dis_sim), ] 


# split object
reslist <- split(res, f=res$cluster)


## takes first three items with highest overall dissim.
lapply(reslist, tail, n=3) 

## returns id´s with highest overall dissimilarity, top 20% 
lapply(reslist, function(x, p) tail(x, round(nrow(x)*p)), p=0.2)
于 2013-10-07T14:27:34.210 回答
1

关于您的评论,请找到以下代码:

请注意,代码可以在美观和效率方面进行改进。此外,我使用了第二个答案,否则会很混乱。

# calculation of centroits based on:
# https://stat.ethz.ch/pipermail/r-help/2006-May/105328.html
cl <- hclust(dist(mydata, diag = TRUE, upper=TRUE))
cent <- tapply(mydata, 
        list(rep(cutree(cl, 5), ncol(mydata)), col(mydata)), mean)
dimnames(cent) <- list(NULL, dimnames(mydata)[[2]])


# add up cluster number and data and split by cluster
newdf <- data.frame(data=mydata, cluster=cutree(cl, k=5))
newdfl <- split(newdf, f=newdf$cluster)

# add centroids and drop cluster info
totaldf <- lapply(1:5, 
           function(i, li, cen) rbind(cen[i, ], li[[i]][ , -11]),
                                li=newdfl, cen=cent)


# calculate new distance to centroits and sort them
dist_to_cent <- lapply(totaldf, function(x)
                   sort(as.matrix(dist(x, diag=TRUE, upper=TRUE))[1, ]))
dist_to_cent

计算质心hclustR-Mailinglist

于 2013-10-07T19:10:36.280 回答