[英]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
> 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.