-1

これが私がやろうとしていることです:

私が比較している2つのファイルがあります。

aaposそのため、ミューテーションの名前と、そのミューテーションに関連付けられた という番号を含む 2 つのファイルがあります。

ファイル 1 にはt多数のミューテーションがあり、ファイル 2 にはs多数のミューテーションがあります。

ここで、ファイル番号 2 の変異には特定の生物学的重要性があるため、ファイル 1 の変異名 (tagnameプログラムで呼び出される) がファイル 2 のタグ名と同等かどうか、および aapos がその特定の変異の数は、ファイル番号 2 の aapos1 と aapos2 の範囲内にあります。

これらの 2 つの条件が満たされている場合、ファイル 1 にある突然変異には特別な生物学的重要性があり、これをカテゴリー 1 と呼びましょう。それ以外の場合は、生物学的重要性を持たないカテゴリー 2 に分類されます。

さらに、これらの各ファイルには と呼ばれる列がありsynonymous、ファイル 1 の各ミューテーションに対して、同義の列に 0 または 1 の番号が割り当てられます。

これが私がやりたいことです: CATEGORY 2 に属する各突然変異について、synonymousその突然変異の列が 0 の場合、カウンターnonsyntwoに 1 を追加し、1 の場合、カウンターsyntwoに 1 を追加します。基本的に、カテゴリ 2 に属するすべての突然変異について、synonymous列に割り当てられた値が 0 の数と、割り当てられた値が 1 の数を数えたいと思います。

ただし、プログラムを実行するnonsyntwosyntwo、 と の数が得られます。これは、使用しているファイル内のタグ名の数よりもはるかに多くなります。と を両方とも 15に変更するst(これらのファイルのそれぞれに何千ものタグ名があります)、 の値として 94 が得られますnonsyntwo

プログラムが 15 個のタグ名を反復処理している場合、これはどのように可能ですか?

for x in range(1,s):
    for b in range (1,t):
        if tagname1[x]== tagname2[b]:   
            if int(aapos1[b]) <= int(aapos[x])<= int(aapos2[b]): 
                snps = snps + 1  
            elif int(synonymous[x]) == 0: 
                nonsyntwo = nonsyntwo + 1
            elif int(synonymous[x]) == 1: 
                syntwo = syntwo + 1 
        elif tagname1[x]!= tagname2[b]: 
            if int(synonymous[x]) == 0: 
                nonsyntwo = nonsyntwo + 1
            elif int(synonymous[x]) == 1: 
                syntwo = syntwo + 1
4

3 に答える 3

0

問題を明確に述べる必要があります。あなたが何を扱っているのかを理解するためだけに、あなたの質問を厳選する必要はありません.

私は次のことを理解しています:

そのため、突然変異の名前と、その突然変異に関連付けられた aapos と呼ばれる番号を含む 2 つのファイルがあります。[...] さらに、これらの各ファイルには、ファイル番号 2 の aapos1 と aapos2 の範囲内に「同義語」という列があります [...]

  1. 2 つのファイルがあります。
  2. 最初のファイルには 3 つの列があります: tagname, appos, synonymous.
  3. 2 番目のファイルには 4 つの列がありますtagname, aapos, appos2, synonymous

ここで、ファイル番号 2 の変異には特定の生物学的重要性があるため、ファイル 1 の変異名 (プログラムではタグ名と呼ばれる) がファイル 2 のタグ名と同等かどうか、およびその特定の突然変異の aapos 番号は、ファイル番号 2 の aapos1 と aapos2 の範囲内にあります。[...] これら 2 つの条件が満たされる場合、ファイル 1 にある突然変異には特別な生物学的重要性があり、それをカテゴリ 1 と呼びましょう。

  1. 最初の列がfile1の列と一致するかどうか、file2の各行をチェックしたい
  2. それが一致し、2 番目の列が file2 の 2 番目と 3 番目の列の範囲内にある場合、その行を category1 というコレクションに追加します。それ以外の場合は、category2 という別のコレクションに追加します。

これらの各ファイルには、「同義語」と呼ばれる列があり、ファイル 1 の各突然変異について、同義語の列には 0 または 1 の番号が割り当てられます。これが私がやりたいことです: CATEGORY に属する各突然変異2、そのミューテーションの「同義語」列が 0 の場合、カウンター「nonsyntwo」に 1 を加算し、1 の場合、カウンター「syntwo」に 1 を加算します。

  1. コレクションから各アイテムcategory2を取り出し、1 の数と 0 の数を数えます。

これが正しければ、必要なものは次のとおりです (ファイルがカンマで区切られていると仮定します)。

import csv
from collections import Counter

with open('file1.txt') as f:
   reader = csv.reader(f, delimiter=',')
   file1 = list(reader)

with open('file2.txt') as f:
   reader = csv.reader(f, delimiter=',')
   file2 = list(reader)

cat1 = []
cat2 = []

for line in file2:
   for line2 in file1:
      if line[0] == line2[0]:
          if int(line2[1]) <= int(line[1]) <= int(line2[2]):
              cat1.append(line)
          else:
              cat2.append(line)

counter = Counter(line[3] for line in cat2)
nonsyntwo = counter['0']
syntwo = counter['1']
于 2013-10-22T05:47:45.343 に答える
0

あなたの問題の性質については明確ではありません。ただし、次の改善提案があります。

aapos = map(int, appos)
aapos1 = map(int, appos1)
aapos2 = map(int, appos2)
synonyms = map(int, synonyms) # or are they already?
for x in range(1,s):
    for b in range (1,t):
        # Here, x and b go from 1 to s resp t.
        # So you are always missing [0] of the array. 
        # Doing
        x, b = x-1, b-1
        # is not very clean, but it helps for now.
        checksyn = True
        if tagname1[x] == tagname2[b]:
            if aapos1[b] <= aapos[x] <= aapos2[b]:
                snps += 1
                checksyn = False
        if checksyn:
            if synonymous[x] == 0: 
                nonsyntwo += 1
            elif synonymous[x] == 1: # if 1 is the only other possible value, an else: would be enough here.
                syntwo += 1
于 2013-10-22T05:54:24.797 に答える
0

私はあなたが何をしようとしているのかを完全には理解していません.仮説に名前を付け始めたとき、それは手に負えなくなりましたが、これはあなたの問題です:

elif tagname1[x]!= tagname2[b]: 
        if int(synonymous[x]) == 0: 
            nonsyntwo = nonsyntwo + 1
        elif int(synonymous[x]) == 1: 
            syntwo = syntwo + 1

これはペアごとに実行されますx,b。これは、最小限 (s-2)(t-2)の時間で実行されることを意味します。これはあなたが望んでいるものではないと思います。

于 2013-10-22T05:20:14.633 に答える