这是我正在尝试做的事情:
我正在比较两个文件。
因此,有两个文件包含与该突变相关的突变名称和一个名为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的列数。
然而,当程序运行时,我最终获得nonsyntwo
和syntwo
的数字,这远远大于我正在使用的文件中的标记名数量。如果我要将s
和t
更改为15(每个文件中都有数千个标记名),那么我会得到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
答案 0 :(得分: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)
次执行。我怀疑这不是你想要的。
答案 1 :(得分:0)
你真的需要清楚地陈述你的问题。我们不应该只是为了理解你正在处理什么来挑选你的问题。
我理解以下内容:
所以有两个文件包含突变和数字的名称, 称为aapos,与该突变有关。 [...] 此外,在每个文件中,都有一个名为“synonymous”的列[...] 在文件号2中的aapos1和aapos2范围内
tagname, appos, synonymous
。tagname, aapos, appos2, synonymous
。现在,文件编号2中的突变具有特定的生物学特征 重要性,所以我要做的是看是否突变名称 (在我的程序中称为标记名)在文件1中等同于标记名 在文件2中,以及该特定突变的aapos编号 落在文件号2中的aapos1和aapos2范围内。[...] 如果满足这两个条件,那么我在文件1中的突变有一个特殊的 生物学意义,我们称之为第1类
在每个文件中,都有一个名为“synonymous”的列,用于 在文件1中的每个突变中,同义列被分配了多个 0或1.现在这就是我想要做的:对于每个属于的变异 到第2类,如果该突变的“同义”列为0,我 希望计数器'nonsyntwo'添加1,如果它是1,那么我想要 计数器'syntwo'加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']
答案 2 :(得分: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