如何使用matchpattern()在R中的多个序列(.fasta)的文件中查找某些氨基酸

时间:2013-07-28 22:12:45

标签: r bioinformatics fasta bioconductor

我有一个文件(mydata.txt),其中包含许多fasta格式的外显子序列。我想找到每个DNA序列的开始('atg')和停止('taa','tga','tag')密码子(考虑到框架)。我尝试使用matchPatternBiostrings R包中的函数)来查找这些氨基酸:

例如mydata.txt可以是:

>a
atgaatgctaaccccaccgagtaa
>b
atgctaaccactgtcatcaatgcctaa
>c
atggcatgatgccgagaggccagaataggctaa
>d
atggtgatagctaacgtatgctag
>e
atgccatgcgaggagccggctgccattgactag

file=read.fasta(file="mydata.txt") 
matchPattern( "atg" , file)

注意:read.fasta是seqinr包中用于导入fasta格式文件的函数。

但是这个命令不起作用!如何使用此功能在每个外显子序列中查找起始和终止密码子? (没有移帧)

2 个答案:

答案 0 :(得分:2)

我很难相信其中一个BioC软件包尚未完成,但如果您想使用基本R功能,请考虑使用gregexpr

x <- c(a='atgaatgctaaccccaccgagtaa', 
  b='atgctaaccactgtcatcaatgcctaa', 
  c='atggcatgatgccgagaggccagaataggctaa', 
  d='atggtgatagctaacgtatgctag', 
  e='atgccatgcgaggagccggctgccattgactag')

starts<-lapply(gregexpr("atg", x), function(x) x[ (x-x[1] %% 3) == 0])
stops <- mapply(function(strg, starts) {poss <- gregexpr("taa|tga|tag", strg) ; poss[[1]][ ( (poss[[1]]-starts) )%% 3 == 0]}, x, starts=unlist(starts))
 stops
#--------------
$a
[1] 22

$b
[1] 25

$c
[1]  7 31

$d
[1] 22

$e
[1] 31

通过检查距离是否可被3整除,检查终止密码子是否在“框内”读取:

> (25-1)%%3
[1] 0

答案 1 :(得分:2)

matchPattern的'subject'参数是一个特殊对象(例如XString)。您可以将序列转换为XStrings,方法是使用粘贴并使用?BString折叠它们。

所以,使用您的数据:

file = read.fasta(file = "mydata.txt")

# find 'atg' locations
atg <- lapply(file, function(x) {
  string <- BString(paste(x, collapse = ""))
  matchPattern("atg", string)
})

atg[1:2]
# $a
#   Views on a 18-letter BString subject
# subject: atgacccccaccgagtaa
# views:
#     start end width
# [1]     1   3     3 [atg]
#
# $b
#  Views on a 21-letter BString subject
# subject: atgcccactgtcatcacctaa
# views:
#     start end width
# [1]     1   3     3 [atg]

举一个简单的例子,找出序列中'atg'的数量和位置:

sequence <- BString("atgatgccatgcccccatgcatgatatg")
result <- matchPattern("atg", sequence)
#   Views on a 28-letter BString subject
# subject: atgatgccatgcccccatgcatgatatg
# views:
#     start end width
# [1]     1   3     3 [atg]
# [2]     4   6     3 [atg]
# [3]     9  11     3 [atg]
# [4]    17  19     3 [atg]
# [5]    21  23     3 [atg]
# [6]    26  28     3 [atg]

# Find out how many 'atg's were found
length(result)
# [1] 6

# Get the start site of each 'atg'
result@ranges@start
# [1]  1  4  9 17 21 26

另外,请查看?DNAString?RNAString。它们类似于BString,只限于核苷酸特征,可以快速比较DNA和RNA序列。

编辑以解决评论中提到的帧移位问题: 您可以使用@DWin提到的模数技巧对结果进行子集化,以获得帧中的atg。

# assuming the first 'atg' sets the frame
in.frame.result <- result[(result@ranges@start - result@ranges@start[1]) %% 3 == 0]
# Views on a 28-letter DNAString subject
# subject: ATGATGCCATGCCCCCATGCATGATATG
# views:
#     start end width
# [1]     1   3     3 [ATG]
# [2]     4   6     3 [ATG]

# There are two 'atg's in frame in this result
length(in.frame.result)
# [1] 2

# With your data:
file = read.fasta(file = "mydata.txt")
atg <- lapply(file, function(x) {
  string <- BString(paste(x, collapse = ""))
  result <- matchPattern("atg", string)
  result[(result@ranges@start - result@ranges@start[1]) %% 3 == 0]
})