【发布时间】:2015-01-14 16:10:03
【问题描述】:
我编写了一个脚本,它可以读取包含多行数据的文本文件。一行数据示例:
10 1100 1101 G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G A/G G G G A/G G G A/G A/G G G A/G G A/G G G G G G . G A/G A/G G G A/G G G G A/G G A A/G A/G A/G G G A/G G G G A/G . G A A/G A . A A A G G G A G A/G A/G A/G A G A/G A A A A A A A/G A
我的脚本根据不同字母的相对数量将每行数据的频率分数计算为百分比。目前,如果百分比分数 > 0.75,我的脚本会输出行的子集和百分比分数。 但是我想让脚本做一些更复杂的事情,但我不知道怎么做。 1) 对于每一行数据,我希望脚本将第 1、2、4 和 5 列数据保存在数组中,并将百分比分数添加为附加值。 2)然后,一旦脚本读取了文本文件中的所有行,我希望它输出百分比分数高于平均百分比分数 >2 个标准差的所有行。
在下面找到我当前的脚本。
(一个小但非必要的附加内容,目前我将每个相关行打印两次,因为如果一个字母的百分比分数> 0.75,另一个字母也总是> 0.75。要解决这个问题,我只需要让脚本在打印一次后继续到下一行数据,但是如果我应该使用 break、continue 或其他东西来让脚本在不结束整个脚本的情况下移动到下一行,我总是会感到困惑。 )
inputfile = open('datafile.txt', 'r')
output = open('output.txt', 'w')
#windowstart = 0
for line in inputfile:
line = line.rstrip()
fields = line.split("\t")
chrom = fields[0]
pos = str(fields[1])
allele_one = str(fields[3])
allele_two = str(fields[4])
#which columns belong to which population
PopulationA = fields[3:26]
PopulationB = fields[26:36]
#sample size of each population
PopulationA_popsize = 46
PopulationB_popsize = 20
#Now count the total number of alleles in each population (Homozygous alleles counted twice, heterozygotes just once)
#count C allele
C_count_PopulationA = (2*PopulationA.count("C")) + PopulationA.count("C/T") + PopulationA.count("A/C") + PopulationA.count("C/G")
percentage_C_PopulationA = float(C_count_PopulationA)/46
#count A allele
A_count_PopulationA = (2*PopulationA.count("A")) + PopulationA.count("A/T") + PopulationA.count("A/C") + PopulationA.count("A/G")
percentage_A_PopulationA = float(A_count_PopulationA)/46
#count T allele
T_count_PopulationA = (2*PopulationA.count("T")) + PopulationA.count("C/T") + PopulationA.count("A/T") + PopulationA.count("G/T")
percentage_T_PopulationA = float(T_count_PopulationA)/46
#count G allele
G_count_PopulationA = (2*PopulationA.count("G")) + PopulationA.count("G/T") + PopulationA.count("A/G") + PopulationA.count("C/G")
percentage_G_PopulationA = float(G_count_PopulationA)/46
#count missing data
null_count_PopulationA = (2*PopulationA.count("."))
percentage_null_PopulationA = float(null_count_PopulationA)/46
#repeat for population B
C_count_PopulationB = (2*PopulationB.count("C")) + PopulationB.count("C/T") + PopulationB.count("A/C") + PopulationB.count("C/G")
percentage_C_PopulationB = float(C_count_PopulationB)/20
A_count_PopulationB = (2*PopulationB.count("A")) + PopulationB.count("A/T") + PopulationB.count("A/C") + PopulationB.count("A/G")
percentage_A_PopulationB = float(A_count_PopulationB)/20
T_count_PopulationB = (2*PopulationB.count("T")) + PopulationB.count("C/T") + PopulationB.count("A/T") + PopulationB.count("G/T")
percentage_T_PopulationB = float(T_count_PopulationB)/20
G_count_PopulationB = (2*PopulationB.count("G")) + PopulationB.count("G/T") + PopulationB.count("A/G") + PopulationB.count("C/G")
percentage_G_PopulationB = float(G_count_PopulationB)/20
null_count_PopulationB = (2*PopulationB.count("."))
percentage_null_PopulationB = float(null_count_PopulationB)/20
#If missing data less than 10% in both populations
if percentage_null_PopulationA < 0.1:
if percentage_null_PopulationB < 0.1:
#calculate frequency difference between populations for each allele
Frequency_diff_C_PopulationA_PopulationB = float(abs(percentage_C_PopulationA - percentage_C_PopulationB))
Frequency_diff_A_PopulationA_PopulationB = float(abs(percentage_A_PopulationA - percentage_A_PopulationB))
Frequency_diff_T_PopulationA_PopulationB = float(abs(percentage_T_PopulationA - percentage_T_PopulationB))
Frequency_diff_G_PopulationA_PopulationB = float(abs(percentage_G_PopulationA - percentage_G_PopulationB))
#if the frequency difference between alleles is greater than 0.75, print part of the row
if Frequency_diff_C_PopulationA_PopulationB >= 0.75:
print >> output, str(chrom) + "\t" + str(pos) + "\t" + str(allele_one) + "\t" + str(allele_two)
if Frequency_diff_A_PopulationA_PopulationB >= 0.75:
print >> output, str(chrom) + "\t" + str(pos) + "\t" + str(allele_one) + "\t" + str(allele_two)
if Frequency_diff_T_PopulationA_PopulationB >= 0.75:
print >> output, str(chrom) + "\t" + str(pos) + "\t" + str(allele_one) + "\t" + str(allele_two)
if Frequency_diff_G_PopulationA_PopulationB >= 0.75:
print >> output, str(chrom) + "\t" + str(pos) + "\t" + str(allele_one) + "\t" + str(allele_two)
我正在寻找每行人群之间的等位基因频率差异。例如,如果我们假设群体 A 中有 10 个个体(前 10 列核苷酸),群体 B 中有 10 个个体(最后 10 列核苷酸,那么在下面的示例数据行中,我们看到群体 A 有 10 个 G 核苷酸。种群 B 有 3 个 G 核苷酸和 7 个 A 核苷酸,因此 2 个种群的频率差异为 70%。
10 20 21 G G G G G G G G G G G G G A A A A A A A
【问题讨论】:
-
与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
-
好的,请注意。赞赏。
标签: python arrays statistics