-1

这是我正在尝试做的事情:

我正在比较两个文件。

因此,有两个文件包含突变名称和一个aapos与该突变相关联的数字,称为 。

在文件 1 中,有t许多突变,在文件 2 中,有s许多突变。

现在,文件 2 中的突变具有特定的生物学意义,所以我要做的是查看文件 1 中的突变名称(tagname在我的程序中调用)是否等同于文件 2 中的标记名,以及 aapos该特定突变的编号在文件编号 2 中的 aapos1 和 aapos2 范围内。

如果满足这两个条件,那么我在文件1中的突变具有特殊的生物学意义,我们称之为1类。否则,它会落入2类,没有生物学意义。

此外,在这些文件中的每一个中,都有一个名为的列synonymous,对于文件 1 中的每个突变,同义列被分配一个数字 0 或 1。

现在这就是我想要做的:对于属于 CATEGORY 2 的每个突变,如果该synonymous突变的列是 0,我希望计数器nonsyntwo加 1,如果它是 1,那么我希望计数器syntwo加 1。本质上,对于属于类别 2 的所有突变,我想要计算synonymous列中有多少分配值为 0,以及有多少分配值为 1。

但是,当程序运行时,我最终会得到一个 和 的数字nonsyntwosyntwo这比我正在使用的文件中的标记名数量要多得多。如果我将两者都更改st15(每个文件中都有数千个标记名),那么我会得到 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 的 aapos1 和 aapos2 范围内都有一个名为“同义词”的列 [...]

  1. 你有两个文件。
  2. 第一个文件有三列:tagname, appos, synonymous.
  3. 第二个文件有四列:tagname, aapos, appos2, synonymous.

现在,文件 2 中的突变具有特定的生物学意义,所以我要做的是查看文件 1 中的突变名称(在我的程序中称为标记名)是否等同于文件 2 中的标记名,以及是否该特定突变的 aapos 编号在文件编号 2 中的 aapos1 和 aapos2 范围内。 [...] 如果满足这两个条件,那么我在文件 1 中的突变具有特殊的生物学意义,我们称之为类别 1

  1. 如果第一列与 file1 中的相匹配,您想检查 file2 中的每一行
  2. 如果匹配,并且第二列在 file2 中第二列和第三列的范围内,则您希望将该行添加到名为 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 回答