2013-08-27 32 views
-1

我再次遇到一些小块。我有一个文件看起来像这样:从位置列表中创建间隔

chr1 142936580 142936581 209 
chr1 142936581 142936582 208 
chr1 142936582 142936583 212 
chr1 142936583 142936584 210 
chr1 142936588 142936590 215 
chr1 142936590 142936591 217 
chr1 142936591 142936592 221 
chr1 142936592 142936593 220 
chr1 145034453 145034454 222 
chr1 145034454 145034455 220 
chr1 145034455 145034456 218 
chr1 145034456 145034457 215 
chr1 145034457 145034459 216 
chr1 145034459 145034460 212 
chr1 161418656 161418657 178 
chr1 161418657 161418658 177 
chr1 161418658 161418659 179 
chr2 90386745 90386747 222 
chr2 90386747 90386748 221 
chr2 90386748 90386750 220 

这里的问题是,有我在文件中的条目太多了,我想,以减少他们开始:在接下来的方式结束的时间间隔(至少是这样的最好的我可以想到): 排序与第一列,然后只使用第二列,并减少它。我的意思是,如果在从142开始的范围内保留最低和最高的条目作为开始,结束位置。然后移动到145 *位置并执行相同的操作。因此,基本上为那些视觉上彼此分开的条目创建开始,结束位置。 我们会或多或少结束:

chr1 142936580 142936592 
chr1 145034453 145034459 
chr1 161418656 161418658 
chr2 90386745 90386748 

那是我的主意如何做到这一点。不过,我坚持使用什么代码。 即使建议都不错 谢谢, Irek

+1

如果你的问题是如何合并间隔,[这个问题](http://stackoverflow.com/q/5679638)可能会帮助你。你知道如何读取和写入文件吗?如果您能向我们展示您目前为止所拥有的内容,并告诉我们您卡在哪里,我很乐意为您提供帮助。 – flornquake

+0

你应该真的提供一些代码来告诉我们你已经尝试了什么。 –

回答

1

如果我明白,你想结合连续的时间间隔。 我建议

from csv import reader 
LIMITINTER= 10 
with open("fichierin.txt") as f: 
    read = reader(f,delimiter="\t") 
    first = last = None 
    for line in read: 
     if last is None: 
      first = last = line 
     else: 
      if abs(int(line[1]) - int(last[2])) < LIMITINTER : 
       last = line 
       continue 
      else: 

       print last[0], first[1], last[2] 
       first = last = line 

    print last[0], first[1], last[2] 

,你将有

chr1 142936580 142936593 
chr1 145034453 145034460 
chr1 161418656 161418659 
chr2 90386745 90386750 

你可以把它的功能和产量线,或者在另一个文件写,等....

编辑:现在最小差异是一个常量

+0

是的,这是mroe或更少我想要的。但是这里的间隔太小。开始的位置应该相差更多chr1 142936580和142936588仍然彼此太靠近。 – Irek

+1

现在用这个编辑它是一个参数集 –

+0

我在你做的改变的同一行中添加了/ 10000,它也很好地工作。谢谢o / – Irek

0

你可以遍历文件并跟踪第一个和最后一个数字在一定范围内。您可以通过转换为整数来提取范围,然后除以10的幂。使用字典存储范围的最低值和最高值。