R语言如何获取各列colMeans最大值对应的kmeans聚类编号
代码实现方案
第一步:批量计算各聚类下的列均值,替代逐组显式索引的冗余写法
不需要手动逐行写cm1、cm2这类重复代码,直接通过聚合函数一次性拿到所有聚类的组内列均值:
# 按kmeans输出的聚类标签分组,计算每个组下所有列的均值 group_means <- aggregate(df, by = list(cluster = fit$cluster), FUN = mean)
计算完成后把聚类编号设为矩阵行名,移除单独的聚类数值列,得到纯均值矩阵方便后续运算:
rownames(group_means) <- group_means$cluster mean_mat <- as.matrix(group_means[, -1])
此时矩阵结构为:每一行对应一个聚类的全列均值,每一列对应原数据框的某一列在所有聚类下的均值分布。
第二步:按排名位次提取对应聚类编号
写一个通用函数,针对矩阵的每一列(也就是原数据框的每一列),按照均值从高到低排序,提取指定位次对应的聚类编号:
# 入参mean_mat是上一步得到的均值矩阵,k是想要的排名位次 # 常用取值:k=1对应最高均值,k=2对应次高均值,k=3对应第三高均值 get_cluster_by_rank <- function(mean_mat, k) { apply(mean_mat, 2, function(current_col) { # 对当前列的所有聚类均值降序排序,返回对应位次的聚类名 ranked_clusters <- names(sort(current_col, decreasing = TRUE)) ranked_clusters[k] }) }
实际调用示例
# 返回每列最高均值对应的聚类编号,输出长度和原数据框列数完全一致 result_max <- get_cluster_by_rank(mean_mat, k = 1) # 返回每列次高均值对应的聚类编号 result_second <- get_cluster_by_rank(mean_mat, k = 2) # 返回每列第三高均值对应的聚类编号 result_third <- get_cluster_by_rank(mean_mat, k = 3)
实现特性
- 不需要手动适配聚类数量,不管kmeans分出多少个组,代码逻辑完全不用修改
- 自动处理均值并列的场景,不会因为数值重复出现排序报错
- 支持任意排名位次调整,不管是要取最高值、次高值还是更低位次的聚类,只要修改传入的k参数即可
- 如果传入的排名k超过了实际聚类总数,会自动返回NA,不会触发索引越界的崩溃
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

