You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:01:21