Как случайным образом извлечь последовательности FASTA с помощью Python?

У меня есть следующие последовательности в формате fasta с заголовком последовательности и ее нуклеотидами. Как я могу случайным образом извлечь последовательности. Например, я хотел бы случайным образом выбрать 2 последовательности из всех последовательностей. Для этого предусмотрены инструменты для извлечения в процентах, но не по количеству последовательностей. Может кто-нибудь помочь мне?

А.фаста

>chr1:1310706-1310726
GACGGTTTCCGGTTAGTGGAA
>chr1:901959-901979
GAGGGCTTTCTGGAGAAGGAG
>chr1:983001-983021
GTCCGCTTGCGGGACCTGGGG
>chr1:984333-984353
CTGGAATTCCGGGCGCTGGAG
>chr1:1154147-1154167
GAGATCGTCCGGGACCTGGGT

Ожидаемый результат

>chr1:1154147-1154167
GAGATCGTCCGGGACCTGGGT
>chr1:901959-901979
GAGGGCTTTCTGGAGAAGGAG

person Xiong89    schedule 07.07.2015    source источник


Ответы (6)


Если вы работаете с файлами fasta, используйте BioPython, чтобы получить n последовательности, используйте random.sample:

from Bio import SeqIO
from random import sample
with open("foo.fasta") as f:
    seqs = SeqIO.parse(f,"fasta")
    print(sample(list(seqs), 2))

Выход:

[SeqRecord(seq=Seq('GAGATCGTCCGGGACCTGGGT', SingleLetterAlphabet()), id='chr1:1154147-1154167', name='chr1:1154147-1154167', description='chr1:1154147-1154167', dbxrefs=[]), SeqRecord(seq=Seq('GTCCGCTTGCGGGACCTGGGG', SingleLetterAlphabet()), id='chr1:983001-983021', name='chr1:983001-983021', description='chr1:983001-983021', dbxrefs=[])]

При необходимости вы можете извлечь строки:

 print([(seq.name,str(seq.seq)) for seq in  sample(list(seqs),2)])
 [('chr1:1310706-1310726', 'GACGGTTTCCGGTTAGTGGAA'), ('chr1:983001-983021', 'GTCCGCTTGCGGGACCTGGGG')]

Если бы строки всегда были парами и вы пропустили метаданные вверху, вы могли бы заархивировать:

from random import sample

with open("foo.fasta") as f:
    print(sample(list(zip(f, f)), 2))

Что даст вам пары строк в кортежах:

[('>chr1:983001-983021\n', 'GTCCGCTTGCGGGACCTGGGG\n'), ('>chr1:984333-984353\n', 'CTGGAATTCCGGGCGCTGGAG\n')]

Чтобы подготовить строки к написанию:

from Bio import SeqIO
from random import sample
with open("foo.fasta") as f:
    seqs = SeqIO.parse(f, "fasta")
    samps = ((seq.name, seq.seq) for seq in  sample(list(seqs),2))
    for samp in samps:
        print(">{}\n{}".format(*samp))

Выход:

>chr1:1310706-1310726
GACGGTTTCCGGTTAGTGGAA
>chr1:983001-983021
GTCCGCTTGCGGGACCTGGGG
person Padraic Cunningham    schedule 07.07.2015
comment
Могу ли я узнать, как избавиться от [('....'),('....')] и сделать вывод презентабельным? - person Xiong89; 07.07.2015
comment
Точно так же, как и ожидаемый результат, потому что я запишу вывод в файл позже. - person Xiong89; 07.07.2015
comment
Я отредактировал ответ, вы можете использовать str.format и распаковать кортежи - person Padraic Cunningham; 07.07.2015

Учитывая формат файла, который вы показали, и предполагая, что файл не слишком велик, вам не нужен какой-либо внешний модуль (например, биопитон), чтобы сделать это:

import random

with open('A.fasta') as f:
    data = f.read().splitlines()
    for i in random.sample(range(0, len(data), 2), 2):
        print data[i]
        print data[i+1]

Пример вывода:

>chr1:984333-984353
CTGGAATTCCGGGCGCTGGAG
>chr1:901959-901979
GAGGGCTTTCTGGAGAAGGAG

Это просто выбирает 2 заголовка случайной последовательности (те строки из A.fasta с четными индексами в data) и строку, следующую за ней.

Если ваш файл большой, то внешние модули могут быть оптимизированы для работы с большими наборами данных.

person mhawke    schedule 07.07.2015

Мало что знаю о Fasta, но в Python есть модуль Fasta (сначала его нужно установить).

>>> from pyfasta import Fasta

>>> f = Fasta('tests/test1.fasta')
>>> sorted(f.keys())
['chr1', 'chr2', 'chr3']

Затем вы можете использовать примерную функцию из модуля Python Random и выбрать столько, сколько хотите, случайным образом...

from random import sample
sample(f, how_many_you_want)
person Hrvoje    schedule 07.07.2015

Зависит от того, установлен ли у вас unix sort или shuf. Если это так, то очень просто выбрать случайные 3000 строк из файл с awk-кодами

  1. Создайте список заголовков

grep '>' A.fasta >ФАЙЛ

  1. Затем выберите 2 случайные строки из этого файла

КОНТИГС=sort -R FILE | head -n2|tr "\n" " "

or

КОНТИГС=shuf -n2 FILE|tr "\n" " "

Затем используйте samtools для извлечения

samtools faidx A.fasta $CONTIGS

person Steven Hart    schedule 23.07.2015

person    schedule
comment
Я широко использовал это в своей работе. Все хорошо. Я работаю неполный рабочий день, так что это может быть не идеально. - person Michael Toney; 15.11.2018

person    schedule
comment
Новая версия версии моего скрипта, которая проверяет наличие дубликатов. - person Michael Toney; 17.11.2018