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

在R中筛选MZ值相差±1以内的串联谱峰行的技术求助

高效筛选MZ值相差±1以内的串联谱峰

核心解决思路

你之前用lag()计算差值只能捕获后一个符合条件的峰,漏掉前一个。要同时保留成对的峰,需要同时检查当前峰与前一个峰、后一个峰的MZ差值——只要其中一个差值在±1以内,就保留该行。

步骤1:准备工具(加载dplyr包)

你已经在使用mutate(),说明用到了dplyr包。如果还没安装,先运行:

install.packages("dplyr")
library(dplyr)

步骤2:先排序(关键!)

必须确保数据按precursorMz分组,再按Mz_Round从小到大排序,否则相邻行的MZ值不连续,差值计算毫无意义:

# 假设你的数据框名为df,先完成排序
df <- df %>%
  arrange(precursorMz, Mz_Round)

步骤3:筛选符合条件的峰

通过计算当前峰与前后峰的差值,筛选出满足条件的行:

df_filtered <- df %>%
  # 按precursorMz分组,只在同组内比较峰(避免跨不同肽段的无效比较)
  group_by(precursorMz) %>%
  # 计算当前峰与前一个峰的差值,以及后一个峰与当前峰的差值
  mutate(
    diff_prev = Mz_Round - lag(Mz_Round),
    diff_next = lead(Mz_Round) - Mz_Round
  ) %>%
  # 筛选:与前峰差≤1 或 与后峰差≤1(abs取绝对值覆盖±1范围)
  filter(abs(diff_prev) <= 1 | abs(diff_next) <= 1) %>%
  # 取消分组,清理临时生成的差值列
  ungroup() %>%
  select(-diff_prev, -diff_next)

针对你的示例数据的效果

运行上述代码后,示例中的行139和140都会被保留:

  • 行139的diff_next为261.20 - 260.20 = 1,满足条件
  • 行140的diff_prev为261.20 - 260.20 = 1,满足条件

大数据框的效率优化

  • dplyr采用向量运算,比基础R循环快很多,适合处理大规模数据
  • 按precursorMz分组后,只在组内计算差值,避免跨组无效计算,进一步提升运算速度

内容的提问来源于stack exchange,提问作者Abigail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:55:20