我想将一个字符串(1)与另一个字符串(2)匹配,并根据字符串(1)中包含的序列信息,基于字符串(2)提取位置信息。我有一个包含肽(氨基酸)序列以及其他化学修饰信息的数据框。这些发生在M或C位置。我希望能够将这些字符串与原始文件匹配,该文件具有使用光谱匹配算法匹配的所有蛋白质序列,并从该蛋白质输出氨基酸和位置。
我已经使用seqinr
包读取了一个.fasta文件,该文件包含20320个条目,条目看起来像这样:
$`sp|Q9Y478|AAKB1_HUMAN` [1]"MGNTSSERAALERHGGHKTPRRDSSGGTKDGDRPKILMDSPEDADLFHSEEIKAPEKEEFLAWQHDLEVNDKAPAQARPTVFRWTGGGKEVYLSGSFNNWSKLPLTRSHNNFVAILDLPEGEHQYKFFVDGQWTHDPSEPIVTSQLGTVNNIIQVKKTDFEVFDALMVDSQKCSDVSELSSSPPGPYHQEPYVCKPEERFRAPPILPPHLLQVILNKDTGISCDPALLPEPNHVMLNHLYALSIKDGVMVLSATHRYKKKYVTTLLYKPI"
我有一个单独的数据框,其中包含一个肽列表,例如:
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]
中。修饰可以包含不同的数字。
理想情况下,我希望输出包含一列肽列表,该列显示氨基酸的一个字母代码,然后是蛋白质中的数字位置:
position
C32
C16, C20
哪些软件包/功能可以使我做到这一点?我可以尝试按原样匹配序列并给出命令以忽略修改[478.99]
以适应当前fasta文件格式的命令吗?还是应该先剥离mod,然后再根据肽的起始/终止位置计算出相对位置?如果我必须将成百上千的肽序列与20k列表进行匹配,什么是快速的方法?任何建议将不胜感激。
答案 0 :(得分:1)
我不确定您的数据格式。对于我的解决方案,我假设您有一个带有大写蛋白质的载体,并且我使用了ptm_probability
列的格式。该功能会针对所有蛋白质检查一种肽,因此使用lapply
或purrr:map
在所有肽上运行它应该是相当简单的。
我的解决方案基本上将修饰的氨基酸转换为小写,然后寻找 蛋白质序列中小写字母的位置。它返回一个列表,其中每个 蛋白质中存在一个具有修饰的氨基酸及其位置的特征向量。
数据:
proteins <-c("PRQTEINCSDFTEEICRPRQTEIN",
"SOMEPRQTEINCSDFTEEICRQTHER",
"PRQTEINPRQTEIN")
peptide <- c("C(1.000)SDFTEEIC(1.000)R")
功能:
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]) )
}
输出:
find_mods(proteins, peptide)
[[1]]
[1] "C8" "C16"
[[2]]
[1] "C12" "C20"
[[3]]
[1] "NA"