2

fastafrmatedファイルを解析するコードを見つけました。各シーケンスにA、T、Gなどがいくつあるかを数える必要があります。次に例を示します。

>gi|7290019|gb|AAF45486.1| (AE003417) EG:BACR37P7.1 gene product [Drosophila melanogaster]
MRMRGRRLLPIIL 

このシーケンスでは、次のようになります。

M - 2
R - 4
G - 1
L - 3
I - 2
P - 1

コードは非常に単純です。

 def FASTA(filename):
  try:
    f = file(filename)
  except IOError:                     
    print "The file, %s, does not exist" % filename
    return

  order = []
  sequences = {}

  for line in f:
    if line.startswith('>'):
      name = line[1:].rstrip('\n')
      name = name.replace('_', ' ')
      order.append(name)
      sequences[name] = ''
    else:
      sequences[name] += line.rstrip('\n').rstrip('*')

  print "%d sequences found" % len(order)
  return order, sequences

x, y = FASTA("drosoph_b.fasta")

しかし、どうすればそれらのアミノ酸を数えることができますか?私はBioPythonを使いたくありません、例えば、これを行う方法を知りたいcountです...

4

4 に答える 4

5

katrielalexが指摘しているように、このタスクに最適です collections.Counter

In [1]: from collections import Counter

In [2]: Counter('MRMRGRRLLPIIL')
Out[2]: Counter({'R': 4, 'L': 3, 'M': 2, 'I': 2, 'G': 1, 'P': 1})

sequencesコード内の dictの値に適用できます。

ただし、このコードを実際に使用することはお勧めしません。BioPython などのライブラリの方が優れています。たとえば、表示するコードは非常にかさばるデータ構造を生成します。FASTA ファイルは非常に大きい場合があるため、メモリ不足になる可能性があります。また、可能性のある例外を可能な限り最善の方法で処理しません。

最後に、ライブラリを使用すると時間を節約できます。

BioPython を使用したコード例:

In [1]: from Bio import SeqIO

In [2]: from collections import Counter

In [3]: for entry in SeqIO.parse('1.fasta', 'fasta'):
   ...:     print Counter(entry.seq)
   ...:     
Counter({'R': 4, 'L': 3, 'I': 2, 'M': 2, 'G': 1, 'P': 1})
于 2013-01-18T11:18:19.673 に答える
4

これは非常に単純な bash コマンドを使用して取得できます。私の答えは以下のとおりです。

cat input.fasta #my input file
>gi|7290019|gb|AAF45486.1| (AE003417) EG:BACR37P7.1 gene product [Drosophila melanogaster]
    MRMRGRRLLPIIL

cat input.fasta | grep -v ">" | fold -w1 | sort | uniq -c

出力:

   1 G
   2 I
   3 L
   2 M
   1 P
   4 R

fold -w1 はすべての文字で分割し、それらを並べ替えて一意のものを数えます

于 2013-01-30T13:12:12.417 に答える
2

コメントでkatrielalexが言及したものの代わりに、別の辞書を使用することになります。コードは以下のとおりです

def FASTA(filename):
  try:
    f = file(filename)
  except IOError:                     
    print "The file, %s, does not exist" % filename
    return

  order = []
  sequences = {}
  counts = {}

  for line in f:
    if line.startswith('>'):
      name = line[1:].rstrip('\n')
      name = name.replace('_', ' ')
      order.append(name)
      sequences[name] = ''
    else:
      sequences[name] += line.rstrip('\n').rstrip('*')
      for aa in sequences[name]:
        if aa in counts:
            counts[aa] = counts[aa] + 1
        else:
            counts[aa] = 1  


  print "%d sequences found" % len(order)
  print counts
  return order, sequences

x, y = FASTA("drosoph_b.fasta")

これは以下を出力します:

1 sequences found
{'G': 1, 'I': 2, 'M': 2, 'L': 3, 'P': 1, 'R': 4}
于 2013-01-18T11:18:12.000 に答える
0
# your previous code here

x, y = FASTA("drosoph_b.fasta")

import collections

for order in x:
  print order, ':',
  print '\n'.join('%s - %d' % (k, v) for k, v in collections.Counter(y[order]).iteritems())
  print 
于 2013-01-18T13:09:47.307 に答える