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
相关产品推荐
相关产品推荐

