我希望将我的数据聚类为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中应用之前的任何帮助或建议
答案 0 :(得分:1)
我不确定它是否正是您正在搜索的内容,但也许有帮助:
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)
答案 1 :(得分: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
用于计算hclust
中的质心,请参阅R-Mailinglist