R语言全局环境矩阵批量处理:统计与K-means聚类求助
R语言批量处理行矩阵:汇总统计+K-means聚类指南
第一步:把全局环境中的行矩阵统一收集到列表
全局环境里零散的单个矩阵很难高效循环,先把它们集中到一个列表里,两种方法任选:
方法1:矩阵名字有规律(如mat1、mat2...mat125)
# 生成矩阵名字并获取对应对象 mat_list <- lapply(paste0("mat", 1:125), get) # 给列表元素命名(对应原矩阵名) names(mat_list) <- paste0("mat", 1:125)
方法2:矩阵名字无规律,自动筛选所有矩阵对象
# 筛选全局环境中所有类型为matrix的对象名 mat_names <- ls()[sapply(ls(), function(x) is.matrix(get(x)))] # 批量获取对象存入列表 mat_list <- lapply(mat_names, get) names(mat_list) <- mat_names
第二步:批量计算汇总统计量
每个行矩阵本质是一维数据,转成向量后计算均值、中位数等统计量,结果存为数据框方便查看:
# 遍历列表,计算每个矩阵的统计量 summary_stats <- lapply(mat_list, function(mat) { vec <- as.vector(mat) data.frame( 均值 = mean(vec, na.rm = TRUE), 中位数 = median(vec, na.rm = TRUE), 标准差 = sd(vec, na.rm = TRUE), 最小值 = min(vec, na.rm = TRUE), 最大值 = max(vec, na.rm = TRUE) ) }) # 合并所有统计量为一个数据框 summary_df <- do.call(rbind, summary_stats)
第三步:K-means聚类分析
分两种常见场景,根据你的需求选择:
场景1:对125个样本(每个矩阵是一个样本)聚类
把所有行矩阵合并成125行×919296列的大矩阵,再做K-means:
# 合并所有行矩阵为大矩阵 combined_mat <- do.call(rbind, mat_list) # 设定聚类数k(自行调整,比如k=5) k <- 5 # 执行K-means kmeans_sample <- kmeans(combined_mat, centers = k) # 把聚类标签合并到统计量数据框 summary_df$聚类标签 <- kmeans_sample$cluster
场景2:对每个矩阵内部的919296个元素聚类
每个矩阵单独做元素级聚类:
# 遍历每个矩阵,执行K-means(k值自行调整,比如k=3) kmeans_elements <- lapply(mat_list, function(mat) { vec <- as.vector(mat) kmeans(vec, centers = 3) }) # 查看第一个矩阵的聚类结果示例 # 簇中心 kmeans_elements[[1]]$centers # 每个元素的簇标签 kmeans_elements[[1]]$cluster
新手常见坑提示
- 直接循环变量名时忘记用
get()获取实际对象,导致操作的是字符串而非矩阵 - 行矩阵未转成向量就计算统计量,部分函数可能无法识别输入格式
- K-means聚类时混淆样本和特征维度:样本是行,特征是列,别搞反
内容的提问来源于stack exchange,提问作者Yogesh Selvakumar
相关产品推荐
相关产品推荐

