R语言按采样位置分组求和合并质谱峰计数矩阵列
R 质谱峰计数按采样位置合并列方案
核心逻辑:先提取列名中的采样位置标识,将点位标记.D/.M/.U替换为.all作为分组依据,再按分组对每行的峰计数求和,即可得到合并后的汇总列。
方法1:Base R 实现(无第三方依赖)
无需安装额外包,直接使用R内置函数完成计算:
# 读入示例数据 data.sed.ex <- structure(list(S19S_0004_Sed_Field_ICR.M_p15 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), S19S_0006_Sed_Field_ICR.D_p2 = c(0, 0, 0, 0, 0, 0, 1, 1, 0, 0), S19S_0006_Sed_Field_ICR.M_p2 = c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0), S19S_0006_Sed_Field_ICR.U_p2 = c(0, 0, 0, 0, 0, 0, 1, 1, 0, 0), S19S_0008_Sed_Field_ICR.M_p15 = c(0, 0, 0, 0, 0, 0, 0, 1, 0, 0), S19S_0009_Sed_Field_ICR.M_p2 = c(0, 0, 1, 0, 0, 0, 1, 0, 0, 0), S19S_0009_Sed_Field_ICR.U_p2 = c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0), S19S_0010_Sed_Field_ICR.D_p15 = c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0), S19S_0010_Sed_Field_ICR.M_p15 = c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0), S19S_0010_Sed_Field_ICR.U_p15 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c("200.002276", "200.015107", "200.0564158", "200.0565393", "200.0578394", "200.0677581", "200.092796", "200.1291723", "200.1292836", "200.9238455"), class = "data.frame") # 批量生成汇总列名:精准替换点位标识为.all col_groups <- gsub("\\.[DMU](?=_p\\d+)", ".all", colnames(data.sed.ex), perl = TRUE) # 按分组逐行求和 merged_df <- sapply(unique(col_groups), function(g) { rowSums(data.sed.ex[, col_groups == g, drop = FALSE]) }) # 保留原质荷比行名,转为数据框格式 rownames(merged_df) <- rownames(data.sed.ex) merged_df <- as.data.frame(merged_df)
结果校验:示例中S19S_0006_Sed_Field_ICR位置三个点位的p2批次样本,质荷比200.092796的计数分别为1、1、1,合并后S19S_0006_Sed_Field_ICR.all_p2列对应值为3;质荷比200.1291723的计数分别为1、0、1,合并后值为2,完全符合需求。
方法2:tidyverse 实现(适配管道工作流)
如果日常使用tidyverse生态处理数据,可以用长表转换的方式实现,逻辑更直观:
library(dplyr) library(tidyr) merged_df_tidy <- data.sed.ex %>% # 将质荷比行名转为独立列 tibble::rownames_to_column("mz") %>% # 宽表转长表,统一处理样本列 pivot_longer(cols = -mz, names_to = "sample_id", values_to = "peak_count") %>% # 生成采样位置分组名 mutate(site_group = gsub("\\.[DMU](?=_p\\d+)", ".all", sample_id, perl = TRUE)) %>% # 按质荷比+采样位置分组求和 group_by(mz, site_group) %>% summarise(peak_count = sum(peak_count), .groups = "drop") %>% # 转换回原宽表格式 pivot_wider(names_from = site_group, values_from = peak_count) %>% # 恢复质荷比为行名 tibble::column_to_rownames("mz")
注意:代码中使用的正则
\\.[DMU](?=_p\\d+)做了位置限定,只会替换点位标识位置的.D/.M/.U字符,不会误修改列名其他位置出现的D/M/U字符,适配所有_p+数字批次后缀的样本命名规则。如果实际样本名后缀格式有变化,对应调整正则匹配规则即可。
内容的提问来源于stack exchange,提问作者Geomicro
相关产品推荐
相关产品推荐

