2015-11-03 3 views
-1

Учитывая ниже файл, я хотел бы, чтобы вычислить частоту появления каждого рисунка, которые не являются одинаковыми для каждого столбца, то есть:Подсчитайте количество specfic моделей в колонке

A/A C/G C/G 
A/T C/C G/G 
A/A C/G C/C 
A/T C/G C/G 
T/T C/G C/G 

Выход:

A/T = 2/5 
C/G = 4/5 
C/G = 3/5 

Я пробовал код в AWK, но, похоже, не работает. Буду признателен за помощь, спасибо!

Edit:

Я воссоздал свой файл следующим образом:

A A C G C G 
A T C C G G 
A A C G C C 
A T C G C G 
T T C G C G 

awk '$1 != $2 {n++}; END {print n}' file 

Это дает мне номер возникновения, что я хочу для первых двух столбцов. Я хочу, чтобы теперь перебирать столбцы и проверять, равны ли каждый из двух столбцов, то есть 1 с 2, 3 с 4 и т. Д.

Как я мог достичь цикла только для столбцов с нечетными номерами?

+2

Похоже, что вы хотите, чтобы мы написали код для вы. Хотя многие пользователи готовы создавать код для кодера, терпящего бедствие, они обычно помогают только тогда, когда плакат уже попытался решить проблему самостоятельно. Хорошим способом продемонстрировать это усилие является включение кода, который вы написали до сих пор, пример ввода (если есть), ожидаемого результата и выход, который вы фактически получаете (вывод консоли, трассировка и т. Д.). Чем больше деталей вы предоставляете, тем больше ответов вы получите. Проверьте [FAQ] и [ask]. –

+1

Итак, где * это * этот код, и что именно делает «не работает» * означает? – jonrsharpe

+0

Теперь у вас есть 2 отдельных вопроса, благодаря вашим изменениям. На какой вопрос мы должны ответить? –

ответ

1

Я хотел бы сделать это следующим образом:

from collections import Counter 

with open('file.txt', 'r') as raw_data: 
    data = [line.strip().split() for line in raw_data.readlines()] 
a = [record[0] for record in data] 
b = [record[1] for record in data] 
c = [record[2] for record in data] 

print Counter(a) 
print Counter(b) 
print Counter(c) 

Он печатает данные в виде словаря, но с этого момента вы справитесь, верно?

+0

Это здорово, спасибо большое! – Homap

0

Это может помочь. Тем не менее, может быть, есть лучшие способы сделать это:

text = """A/A C/G C/G 
A/T C/C G/G 
A/A C/G C/C 
A/T C/G C/G 
T/T C/G C/G""" 

first_column = list() 
second_column = list() 
third_column = list() 

for row in text.strip().split('\n'): 
    columns = row.split() 
    first_column.append(columns[0]) 
    second_column.append(columns[1]) 
    third_column.append(columns[2]) 

first_column_ocurrences = dict((i, "{}/{}".format(first_column.count(i), len(first_column))) for i in first_column) 
second_column_ocurrences = dict((i, "{}/{}".format(second_column.count(i), len(second_column))) for i in second_column) 
third_column_ocurrences = dict((i, "{}/{}".format(third_column.count(i), len(third_column))) for i in third_column) 

print "First column:" 
print "-------------" 
for k,v in first_column_ocurrences.items(): 
    print "{} = {}".format(k,v) 

print "\nSecond column:" 
print "-------------" 

for k,v in second_column_ocurrences.items(): 
    print "{} = {}".format(k,v) 

print "\nThird column:" 
print "-------------" 

for k,v in third_column_ocurrences.items(): 
    print "{} = {}".format(k,v) 

Выход:

First column: 
------------- 
A/T = 2/5 
T/T = 1/5 
A/A = 2/5 

Second column: 
------------- 
C/C = 1/5 
C/G = 4/5 

Third column: 
------------- 
G/G = 1/5 
C/C = 1/5 
C/G = 3/5 
0

awk на помощь!

работает для любого четного числа столбцов.

awk '{for(i=1;i<=NF;i+=2) 
     if($i!=$(i+1)) 
      a["column "i": "$i"/"$(i+1)]++} 
    END{for(k in a) print k,a[k]"/"NR}' file 

column 1: A/T 2/5 
column 3: C/G 4/5 
column 5: C/G 3/5 
0

Вам не нужно хранить строки в памяти на всех, вы можете также использовать CSV LIB делать синтаксический:

from collections import Counter 
import csv 
with open('file.txt', 'r') as raw_data: 
    cn_a, cn_b, cn_c = Counter(),Counter(), Counter() 
    for a ,b, c in csv.reader(raw_data,delimiter=" "): 
     cn_a[a] += 1 
     cn_b[b] += 1 
     cn_c[c] += 1 
Смежные вопросы