我有一个文件1具有从1号位置到10号位置的染色体1等区域信息,如下所示:
chromosome,start_position,end_position
1,1,10
1,11,20
file2具有每个位置的值,例如在染色体1上的位置6,具有一些值,如下所示:
chromosome,position,value
1,1,value1
1,2,value2
1,6,value3
1,13,value4
我想根据位置是否将file2中的值添加到file1
在file2中属于file1中的任何区域,类似于:
chromosome,start_position,end_position,total_value
1,1,10,value1+value2+value3
1,11,20,value4
两个文件都可以超过1000万行,我应该通过查看file2的每一行(查看该位置是否在file1的任何区域中),或者使file1的每一行都成为一个字典(然后找到值)在file2中?然后添加?)?
我怎样才能获得总价值' file1中的每一行? 谢谢大家!
答案 0 :(得分:0)
我认为你不一定在寻找效率最高的代码,而是一个能完成工作的代码?
我会将文件2中的值读入字典,密钥为(chromosome, start)
对(假设文件2中的开头和结尾始终相同)。
然后逐行读取文件1,并在“文件2”字典中查找所有相关值,将结果总和追加到行尾(可能在新文件中):
import numpy as np
for line in file1:
chromosome, start, end = line.split(',')
total_value = np.sum([file2_dict.get([(chromosome,str(i))], 0) for i in
range(int(start), int(end)+1)])
#do something with the total value, maybe write to another file.
#Could do:
new_line = ','.join([chromosome, start, end, total_value]) + '\n'
我将把剩下的实现细节留给你(比如从文件2中获取字典)。它可能对内存使用量有点沉重,但希望不会太糟糕。
请注意.get()
方法与字典查找的使用 - 这将确保字典中找不到的任何键都返回0
。您决定这是否适用于您的情况。另请注意使用str
和int
在文本和数字之间进行转换。您可以根据实施情况决定这是否合适。
另外,如果您之前没有遇到过Python列表推导,请对此进行一些研究。这就是允许我们编写单行以获得所有相关值的总和的原因。