首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配另一个字符串(2)中的字符串(1),并根据字符串(2)提取位置信息

匹配另一个字符串(2)中的字符串(1),并根据字符串(2)提取位置信息
EN

Stack Overflow用户
提问于 2018-09-08 01:27:54
回答 1查看 118关注 0票数 0

我想将字符串(1)与另一个字符串(2)进行匹配,并基于字符串(1)中包含的序列信息,提取基于字符串(2)的位置信息。我有一个包含肽(氨基酸)序列的数据帧,其中包含额外的化学修饰信息。这些发生在M或C位置。我希望能够将这些字符串与原始文件进行匹配,该文件包含使用光谱匹配算法匹配的所有蛋白质序列,并输出该蛋白质的氨基酸和位置。

我使用seqinr包读入了一个包含20320个条目的.fasta文件,这些条目如下所示:

$`sp|Q9Y478|AAKB1_HUMAN` [1]"MGNTSSERAALERHGGHKTPRRDSSGGTKDGDRPKILMDSPEDADLFHSEEIKAPEKEEFLAWQHDLEVNDKAPAQARPTVFRWTGGGKEVYLSGSFNNWSKLPLTRSHNNFVAILDLPEGEHQYKFFVDGQWTHDPSEPIVTSQLGTVNNIIQVKKTDFEVFDALMVDSQKCSDVSELSSSPPGPYHQEPYVCKPEERFRAPPILPPHLLQVILNKDTGISCDPALLPEPNHVMLNHLYALSIKDGVMVLSATHRYKKKYVTTLLYKPI"

我有一个单独的数据帧,其中包含肽的列表,例如:

代码语言:javascript
复制
           ptm_probability                    ptm_peptide            protein_ID protein_description
1 C(1.000)SDFTEEIC(1.000)R K.C[478.99]SDFTEEIC[478.99]R.R sp|P50213|IDH3A_HUMAN Isocitrate dehydrogenase [NAD] subunit alpha, mitochondrial OS=Homo sapiens GN=IDH3A PE=1 SV=1

ptm_probability中的氨基酸序列显示了修饰存在的分数和可能性。ptm_peptide中的序列具有由"."表示的序列前后的氨基酸,而修饰包含在括号[478.99]中,修饰可以包含不同的数字。

理想情况下,我希望输出包含一个肽列表列,该列显示氨基酸的一个字母代码,后跟蛋白质中的数字位置:

代码语言:javascript
复制
position
C32
C16, C20

哪些包/函数可以让我做到这一点?我可以尝试按原样匹配序列,并发出命令忽略修改后的[478.99]以适应fasta文件当前的格式吗?或者是否应该剥离mods,然后根据肽的起始/结束位置来计算相对位置?如果我必须将成百上千的肽序列与20k的列表进行匹配,那么有什么快速的方法可以做到这一点?任何建议都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-09-08 21:29:11

我不确定你的数据的格式。对于我的解决方案,我假设您有一个大写蛋白质的向量,我使用您的ptm_probability列的格式。该功能检查一个肽与所有蛋白质,它应该是合理的直接使用lapplypurrr:map来运行它对所有肽。

我的解决方案基本上是将修饰的氨基酸转换为小写,然后查找小写字母在蛋白质序列中的位置。它返回一个列表,其中每个蛋白质都有一个带有修饰氨基酸及其位置的字符向量。

数据:

代码语言:javascript
复制
proteins <-c("PRQTEINCSDFTEEICRPRQTEIN",
             "SOMEPRQTEINCSDFTEEICRQTHER",
             "PRQTEINPRQTEIN")

peptide <- c("C(1.000)SDFTEEIC(1.000)R")

功能:

代码语言:javascript
复制
library(stringi)
library(purrr)

find_mods <- function(proteins, peptide){

  # first convert the amino acid with the modificiation
  # (prior to the opening parenthesis) to lowercase
  peptide <- gsub("(.)(?=\\()", "\\L\\1", peptide, perl = TRUE)

  # strip everything that is not a letter from the peptide string
  peptide <- gsub("[^[:alpha:]]", "", peptide)

  # do a case insensitive matching of the peptide sequence in the protein
  # and replace that occurrence with the peptide sequence. Now the modified
  # amino acids in the protein are in lowercase
  pattern <- paste0("(?i)", peptide)
  proteins <- gsub(pattern, peptide, proteins, perl = TRUE)

  # Find the lowercase letters in all proteins
  a <- gregexpr("[a-z]", proteins)
  matches_a <- regmatches(proteins, a)

  # Find the positions of all lowercase letters in all
  # proteins 
  l1 <- stringi::stri_locate_all(proteins, regex = "[a-z]")

  #combine letter and position of the modifications
  purrr::map2(matches_a,l1, ~ paste0(toupper(.x),.y[,1]) )
  }

输出:

代码语言:javascript
复制
find_mods(proteins, peptide)
[[1]]
[1] "C8"  "C16"

[[2]]
[1] "C12" "C20"

[[3]]
[1] "NA"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52227153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档