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

R语言中为字符串内缺失蛋白ID的磷酸化片段补全前置ID

问题描述

现有数据框DT的Modifications.of.Proteins列,每行是由分号分隔的字符串片段。多数磷酸化片段(格式为NxPhospho [...],N为任意数字)前带有蛋白ID(如Q99676、A6H8Y1这类格式),但部分片段缺失蛋白ID,需要将该片段的前一个有效蛋白ID填充到对应位置。

示例数据
C1 <- c("Q99676 1xPhospho [T581(100)]; Q8TBZ5 1xPhospho [T402(100)]; Q9Y2P0 1xPhospho [T413(100)]; Q15776 1xPhospho [T513(100)]; O14978 1xPhospho [T513(100)]; O43309 1xPhospho [T492(100)]; 1xPhospho [T520(100)]; Q9P2J8 1xPhospho [T803(100)]; A6NP11 1xPhospho [T319(100)]")
C2 <- c("A6H8Y1 1xPhospho [T915(100)]; 1xPhospho [T1131(100)]")
C3 <- c("Q9H1B7 1xPhospho [T915(100)]; Q8K3X4 1xPhospho [T915(100)]")

DT <- data.frame(Modifications.of.Proteins = c(C1, C2, C3))
解决方案

使用R语言处理,核心思路是拆分每行字符串为独立片段,遍历片段时记录最近的有效蛋白ID,对缺失ID的磷酸化片段补全ID后再合并:

library(stringr)

DT$Modifications.of.Proteins <- sapply(DT$Modifications.of.Proteins, function(x) {
  # 拆分字符串为单个片段,去除首尾空格
  fragments <- str_split_trim(x, ";")
  last_id <- ""
  processed <- lapply(fragments, function(frag) {
    # 判断当前片段是否以数字+xPhospho开头(即缺失蛋白ID)
    if(str_detect(frag, "^\\d+xPhospho")) {
      paste(last_id, frag)
    } else {
      # 提取当前片段的蛋白ID(第一个空格前的内容)
      current_id <- str_extract(frag, "^\\w+")
      last_id <<- current_id
      frag
    }
  })
  # 合并处理后的片段
  paste(unlist(processed), collapse = "; ")
})
验证结果

运行上述代码后,DT$Modifications.of.Proteins的结果与预期一致:

[1] "Q99676 1xPhospho [T581(100)]; Q8TBZ5 1xPhospho [T402(100)]; Q9Y2P0 1xPhospho [T413(100)]; Q15776 1xPhospho [T513(100)]; O14978 1xPhospho [T513(100)]; O43309 1xPhospho [T492(100)]; O43309 1xPhospho [T520(100)]; Q9P2J8 1xPhospho [T803(100)]; A6NP11 1xPhospho [T319(100)]"
[2] "A6H8Y1 1xPhospho [T915(100)]; A6H8Y1 1xPhospho [T1131(100)]"
[3] "Q9H1B7 1xPhospho [T915(100)]; Q8K3X4 1xPhospho [T915(100)]"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:04:56