R语言通过循环实现任意列数质谱数据按每3列分组
需求背景
需要将数据框按指定模式拆分列,适配质谱表达数据集的特征:所有样本均为三重复、总列数可被3整除,且不同实验产出的数据集列数不固定,无需针对固定列数硬编码拆分逻辑。
12列示例数据框结构如下:
此前针对固定2组6列场景的硬编码实现仅能处理提前已知分组数的情况,代码如下:
data = as.matrix(input_data) id0 = which(class == 0) id1 = which(class == 1) data0 <- data[,id0] data1 <- data[,id1]
已测试的分组数计算逻辑:
class = c(0,0,0,1,1,1) length(class) x <- length(class)/3 x
通用循环实现方案
代码自动识别传入的分组向量中的所有分组ID,循环提取对应列存入列表,适配任意符合三重复规则的列数输入:
# 基础输入校验,避免不符合规则的输入导致运行错误 input_data <- as.matrix(input_data) stopifnot( "数据总列数必须可被3整除" = ncol(input_data) %% 3 == 0, "分组向量长度必须与数据列数一致" = length(class) == ncol(input_data) ) # 自动提取所有唯一分组ID group_ids <- unique(class) # 初始化列表存储各分组拆分结果 group_result <- list() # 循环遍历每个分组,提取对应列 for (gid in group_ids) { col_index <- which(class == gid) group_result[[paste0("data", gid)]] <- input_data[, col_index] }
使用说明
- 拆分结果统一存在
group_result列表中,要获取分组0的子矩阵,直接调用group_result$data0即可,和之前硬编码生成的data0完全一致 - 无需提前指定分组总数,不管是2组6列、4组12列还是更多分组的数据集,只要传入对应长度的
class分组向量即可自动完成拆分 - 如果需要更简洁的非循环写法,可直接用
split函数实现,效果完全相同:
group_result <- lapply(split(seq_len(ncol(input_data)), class), function(col_idx){ input_data[, col_idx] })
测试示例
以6列2分组数据为例:
# 定义分组向量 class <- c(0,0,0,1,1,1) # 模拟10行6列的测试数据集 input_data <- matrix(rnorm(60), nrow = 10, ncol = 6) # 运行上述拆分代码后,group_result$data0为前3列,group_result$data1为后3列
如果是12列4分组场景,只需将class替换为对应长度的向量如c(0,0,0,1,1,1,2,2,2,3,3,3),无需修改拆分逻辑即可自动得到4个3列的子矩阵。
内容的提问来源于stack exchange,提问作者KABILAN
相关产品推荐
相关产品推荐

