-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

这里的问题是我的文件中有太多条目,我想以以下方式减少它们以开始:结束间隔(至少这是我能想到的最好的):使用第一列排序,然后仅使用第二列并减少它。我的意思是,如果条目 lis 在从 142 开始的范围内,则保持最低和最高条目作为开始、结束位置。然后移动到 145* 个位置并做同样的事情。所以基本上为那些在视觉上彼此分开的条目集创建开始,结束位置。我们最终或多或少会得到:

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

这就是我的想法如何做到这一点。但是我被困在要使用什么代码上。甚至建议都很好谢谢, Irek

4

2 回答 2

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 

你可以把它放在函数和屈服行中,或者写在另一个文件中,等等......

编辑:现在最小的区别是一个常数

于 2013-08-27T09:20:25.610 回答
0

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

于 2013-08-27T09:03:23.973 回答