簡體   English   中英

搜索DNA序列中的字符串

[英]Search for characters string in a DNA sequence

我正在嘗試查看基因序列中核苷酸的某些模式。 我剛剛完成read.table來獲取它,但是我也嘗試將其轉換為向量和數據幀。

如何搜索模式(例如AACG )或什至只是一個核苷酸字符? 我已經嘗試了grep%in%但是它們都返回空結果。 我可能忽略了相對簡單的事情。

這就是我將數據輸入程序的方式。 這是一個巨大的文件; 20,347個字母,全為ACTG

data <- read.table(MTHFR.txt) 

我一直在嘗試以這種方式將其放入字符向量中。

data.cv <- as.character(data)

但這正在創建似乎是行號的列表,而不是核苷酸序列。

數據在此處在線獲得 到目前為止,這是數據頭:

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

對於大多數與序列相關的生物信息學任務,您確實需要熟悉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

我提出了一種使用biopython來讀取序列並獲得反向互補的解決方案,然后使用簡單的算法來獲取簡單的已知k-mer的位置(如果您想要更復雜的東西,biopython具有搜索基序的功能)。

從文件中讀取序列(假設您具有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個位置。)

“尋找某些模式”有點含糊。 您是否要提取圖案? 您是否要查找文本中出現的間隔? 我將嘗試同時假設兩者,但是請添加所有可以幫助您指定目標的內容。

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”模式

> 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"

希望這對您有所啟發

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM