2013-08-04 1 views
2

와 정수에 문자 배열을 변환 : 각 열은 두 종류의 문자로 구성하는 것이내가 문자 배열의 형태로 데이터의 조각이 파이썬

cgcgcg 
aacacg 
cgcaag 
cgcacg 
agaacg 
cacaag 
agcgcg 
cgcaca 
cacaca 
agaacg 
cgcacg 
cgcgaa 

공지 사항. 열의 비율에 따라 정수 0 또는 1로 변환해야합니다. 예를 들어 첫 번째 열에는 8 개의 c와 4 개의 a가 있으므로 c가 대다수 인 경우 0으로 코딩하고 다른 하나는 1로 코딩해야합니다.

zip()을 사용하여이 배열을 파이썬 그리고 목록에 각 열을 얻을 :

In [28]: lines = [l.strip() for l in open(inputfn)] 

In [29]: list(zip(*lines)) 
Out[29]: 
[('c', 'a', 'c', 'c', 'a', 'c', 'a', 'c', 'c', 'a', 'c', 'c'), 
('g', 'a', 'g', 'g', 'g', 'a', 'g', 'g', 'a', 'g', 'g', 'g'), 
('c', 'c', 'c', 'c', 'a', 'c', 'c', 'c', 'c', 'a', 'c', 'c'), 
('g', 'a', 'a', 'a', 'a', 'a', 'g', 'a', 'a', 'a', 'a', 'g'), 
('c', 'c', 'a', 'c', 'c', 'a', 'c', 'c', 'c', 'c', 'c', 'a'), 
('g', 'g', 'g', 'g', 'g', 'g', 'g', 'a', 'a', 'g', 'g', 'a')] 

그것은 우리 때문에 (0)이 모두 확인 될 것입니다 int로 '0'또는 'C'로 정수, 즉 'C'로 엄격하게 그들을 변환 할 필요는 없습니다 어쨌든 탭으로 구분 된 파일에 해당 파일을 쓰려고합니다. 이 같은

+0

? 그렇다면 0/1을 모호하게 만드는 것이 좋은 생각이라고 생각하지 않습니다. 가장 공통적 인 뉴클레오티드가 '0'인 것은 왜 중요합니까? (또는 나는 DNA에 대해서 잘못 알고 있습니까?) – AdamKG

+0

대다수가'g'이면 어떻게 될까요? 'c'는 1이어야하고,'a'는 0 ... – tamasgal

+0

@ AdamKG 네, DNA 물건입니다. 모호하지는 않습니다. 왜냐하면 우리는 4 개의 염기를 가지고 있지만 항상 쌍으로 나타납니다. 즉 A와 T, C와 G가 있으므로 데이터 분석에 있어서는 두 개의 숫자가 필요합니다. – qed

답변

2

뭔가 :

lis = [('c', 'a', 'c', 'c', 'a', 'c', 'a', 'c', 'c', 'a', 'c', 'c'), 
('g', 'a', 'g', 'g', 'g', 'a', 'g', 'g', 'a', 'g', 'g', 'g'), 
('c', 'c', 'c', 'c', 'a', 'c', 'c', 'c', 'c', 'a', 'c', 'c'), 
('g', 'a', 'a', 'a', 'a', 'a', 'g', 'a', 'a', 'a', 'a', 'g'), 
('c', 'c', 'a', 'c', 'c', 'a', 'c', 'c', 'c', 'c', 'c', 'a'), 
('g', 'g', 'g', 'g', 'g', 'g', 'g', 'a', 'a', 'g', 'g', 'a')] 
def solve(lis): 
    for row in lis: 
     item1, item2 = set(row) 
     c1, c2 = row.count(item1), row.count(item2) 
     dic = {item1 : int(c1 < c2), item2 : int(c2 < c1)} 
     yield [dic[x] for x in row] 
...   
>>> list(solve(lis)) 
[[0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0], 
[0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0], 
[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0], 
[1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 
[0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1], 
[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1]] 

collections.Counter 사용 : 나는 우리가 DNA 염기쌍을 얘기하고, 당신이 여기에있는 문자를 기반으로 추측하고있어

from collections import Counter 
def solve(lis): 
    for row in lis: 
     c = Counter(row) 
     maxx = max(c.values()) 
     yield [int(c[x] < maxx) for x in row] 
...   
>>> pprint(list(solve(lis))) 
[[0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0], 
[0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0], 
[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0], 
[1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 
[0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1], 
[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1]] 
+0

사전에'int (c1 qed

+0

@CravingSpirit 이미 수정했습니다. –