Как получить процентную частоту букв в каждой позиции из списка строк в Python? - PullRequest
0 голосов
/ 30 мая 2011

У меня есть список таких строк:

список:

('aatt')
('aaga')
('aaac')
('gtag')

#the real list have thousands of strings 

оптимальный желаемый результат - это табличный файл, подобный следующему:

0       1       2       3
a:75%   a:75%   a:50%   a:25%
g:25%   t:25%   g:25%   c:25%
                t:25%   g:25%
                        t:25%

(заголовок не нужен)

Я сделал для этого сценарий bash, но сейчас я изучаю python и хотел бы с ним работать.

Это мой код bash:

#!/bin/bash

for i in $(echo 1 2 3 4) 

do echo $i && cat FILE | grep N -v | awk -F "" '{print $'$i'}' | awk -f ./WC 

done

, где WC - следующий словарь:

BEGIN {
    FS="[^a-zA-Z]+"
}
{
     for (i=1; i<=NF; i++)
          words[toupper($i)]++
}
END {
    for (i in words)
         print i, words[i]
}

1 Ответ

3 голосов
/ 30 мая 2011

Здесь вы получите несколько резких комментариев, но я постараюсь дать вам несколько указателей :) Судя по вашим данным, кажется, что вы пытаетесь выполнить SNP, вызывая список последовательностей, которые у вас есть? Учитывая такие данные:

d = ['aatt','aaga','aaac','gtag']

Первое, что вы должны сделать, - это предварительно выделить словарь, в котором будет храниться количество букв в каждой позиции. Я предполагаю, что здесь у вас есть только 4 буквы, то есть a, t, c и g, и вы знаете максимальную длину ваших строк. Если вы этого не сделаете, вы можете извлечь его так:

maxLen = max(map(len,l))

Когда у вас есть это, создайте свой словарь:

freqDict = dict([(i,{'a':0.0,'t':0.0,'c':0.0,'g':0.0}) for i in xrange(maxLen)])

А затем сохранить количество букв на позицию:

for s in l:
  for i,b in enumerate(s):
    freqDict[i][b] += 1

Это должно привести к этому:

In [26]: freqDict
Out[26]: 
{0: {'a': 3.0, 'c': 0.0, 'g': 1.0, 't': 0.0},
 1: {'a': 3.0, 'c': 0.0, 'g': 0.0, 't': 1.0},
 2: {'a': 2.0, 'c': 0.0, 'g': 1.0, 't': 1.0},
 3: {'a': 1.0, 'c': 1.0, 'g': 1.0, 't': 1.0}}

С этого момента вам решать, как вы хотите распечатать результаты. Возможно, будет более эффективно печатать результаты с одной позицией на строку, чтобы вам не приходилось повторять весь список позиций 4 раза, т.е.

for i in freqDict:
  vs = freqDict[i]
  sumvs = sum(vs.values())
  print '%d\t%s' % (i,'\t'.join(['%s:%.1f' % (b[0],b[1]*100/sumvs) for b in vs.items()]))

Генерация:

0   a:75.0  c:0.0   t:0.0   g:25.0
1   a:75.0  c:0.0   t:25.0  g:0.0
2   a:50.0  c:0.0   t:25.0  g:25.0
3   a:25.0  c:25.0  t:25.0  g:25.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...