在DNA序列中搜索字符串

时间:2016-12-01 04:15:14

标签: r regex vector character bioinformatics

我试图查看基因序列中某些核苷酸的模式。我刚刚完成read.table以获取它,但我也尝试将其转换为矢量和数据框。

如何搜索模式(例如AACG)或甚至只搜索单个核苷酸字符?我已经尝试了grep%in%,但这些都返回了null结果。这可能是我忽略的相对简单的事情。

这就是我将数据导入程序的方式。这是一个巨大的档案;所有ACTG都是20,347封。

data <- read.table(MTHFR.txt) 

我一直试图以这种方式将它变成一个角色向量;

data.cv <- as.character(data)

但那会创建一个似乎是行号的列表,而不是核苷酸序列。

数据可用online here。截至目前,这是数据的负责人:

head(data)
                                                                      V1
1 ATGACGATAAAGGCACGGCCTCCAACGAGACCTGTGGGCACGGCCATGTTGGGGGCGGGGCTTCCGGTCA
2 CCCGCGCCGGTGGTTTCCGCCCTGTAGGCCCGCCTCTCCAGCAACCTGACACCTGCGCCGCGCCCCTTCA
3 CTGCGTTCCCCGCCCCTGCAGCGGCCACAGTGGTGCGGCCGGCGGCCGAGCGTTCTGAGTCACCCGGGAC
4 TGGAGGGTGAGTGACGGCGAGGCCGGGGTCGCCGGGAGGGAGATCCTGGAGCCGGCAAACAACCTCCCGG
5 GGGCAAGGACGTGCTTGTGGGCGGGGAGCGCTGGAGGCCGGCCTGCCTCTCTTCTTGGGGGGGGCTGCCG
6 CCTCCCTTGCGCACCCTTCGCGGGATTAGTGTAACTCCCAATGGCTACCACTTCCAGCGACCGCCAACCC

3 个答案:

答案 0 :(得分:3)

对于大多数与序列相关的生物信息学任务,您确实需要熟悉Bioconductor项目中的一些更常见的包。许多常见任务都实现了快速的解决方案。

Biostrings具有DNAString和DNAStringSet等类,用于有效地存储和操作DNA串,以及相应的AA和RNA类。包括用于搜索,反向赞美等的各种功能。听起来您已经导入了数据,但另一种方法是使用readDNAStringSet()功能。

library(Biostrings)

data <- 'ATGACGATAAAGGCACGGCCTCCAACGAGACCTGTGGGCACGGCCATGTTGGGGGCGGGGCTTCC'
dna <- DNAString(data)

matchPattern('GGG', dna)

  Views on a 65-letter DNAString subject
subject: ATGACGATAAAGGCACGGCCTCCAACGAGACCTGTGGGCACGGCCATGTTGGGGGCGGGGCTTCC
views:
    start end width
[1]    36  38     3 [GGG]
[2]    51  53     3 [GGG]
[3]    52  54     3 [GGG]
[4]    53  55     3 [GGG]
[5]    57  59     3 [GGG]
[6]    58  60     3 [GGG]

countPattern('GGG', dna)
[1] 6

countPattern('GGA', reverseComplement(dna)) #number of occurrances of 'TCC' in forward strand
[1] 2

答案 1 :(得分:2)

我提出了一个解决方案,使用biopython来读取序列并获得它的反向补码,然后使用简单的算法来获得一个简单的已知k-mer的位置(如果你想要更复杂的东西,biopython具有{{{ 3}})。

从文件中读取序列(假设你有fasta格式):

from Bio import SeqIO
seq_record = SeqIO.read("my_sequence.fa", format="fasta")

制作正向和反向补码的大写(以防万一)版本:

fwd = str(seq_record.seq.upper())
rev = str(seq_record.seq.reverse_complement().upper())

找到模式发生的位置(位置将在0基坐标中):

pattern = "ACTG"
k = len(pattern)

positions_in_fwd = [i for i in range(1 + len(fwd) - k) if fwd[i:i+k] == pattern]
positions_in_rev = [i for i in range(1 + len(rev) - k) if rev[i:i+k] == pattern]

(根据你给出的序列和模式,我在序列中找到24个位置,在逆序补码中找到20个位置。)

答案 2 :(得分:1)

&#34;寻找某些模式&#34;有点模糊。你想提取模式吗?您是否试图找出它在文本中出现的间隔?我将尝试假设两者,但添加任何可以帮助指定目标的内容。

library(stringi)
library(magrittr)
# Data from site you provided was stored to "t.txt" on
# my machine so starting there
a <- readLines('t.txt')

数据信息

 > summary(a)
    Length     Class      Mode 
      292   character   character 

查看数据集的头部

 > head(a,2)
    [1] "GTCAAGTTTTTTTGTTTATTTTTGAGACAGAGTCTGGCTCAATTGCCCAGGCTGAAGCAGAGGAGTGATC"
    [2] "TCAGCTCACTGCAACCTCTGCCTCCCGGGTTCAAGTGATTCTCCCGCCTCAGCTTCCTGAGTAGCTGGGA"
    > sum(nchar(a))
    [1] 20374

现在我们有了数据,我们就可以提取出来的AACG&#39;图案

> aa <- stri_extract_all_regex(a, 'AACG', 
                         omit_no_match = F, simplify = T) %>% 
unlist %>% as.character() %>% (function(x)x[!is.na(x)])

 > aa 
[1] "AACG" "AACG" "AACG" "AACG" "AACG" "AACG" "AACG" "AACG"
[9] "AACG" "AACG" "AACG" "AACG" "AACG" "AACG" "AACG" "AACG"
[17] "AACG"

将数据集转换为一个连续的字符串:

a_flat <- paste0(a, collapse = "")

而不是提取,我们可以找到文本中出现的位置并转换为数据框

bb <- as.data.frame(stri_locate_all_regex(a_flat, "AACG")[[1]]) 

这给我们的是模式发生的位置。

> bb
   start   end
1    807   810
2   1244  1247
3   1748  1751
4   1791  1794
5   2306  2309
6   3560  3563
7   4217  4220
8   4927  4930
9   6504  6507
10  8668  8671
11  9827  9830
12 10333 10336
13 11446 11449
14 12779 12782
15 13619 13622
16 16604 16607
17 16659 16662
18 19200 19203
19 20181 20184
20 20228 20231

我们可以使用这些位置将扁平字符串拆分为我们想要的

 > sapply(1:nrow(bb), function(i){
    stri_sub(a_flat, bb[i,'start'], bb[i,'end'])
})
[1] "AACG" "AACG" "AACG" "AACG" "AACG" "AACG" "AACG" "AACG"
[9] "AACG" "AACG" "AACG" "AACG" "AACG" "AACG" "AACG" "AACG"
[17] "AACG" "AACG" "AACG" "AACG"

希望这给你带来一些启示