用于识别样品中最小染色体区域的Python

时间:2019-03-18 14:35:22

标签: python bioinformatics

我有多个示例文件(> 20),如下所示:

chr startpos    endpos
1   14930   818094
1   818161  31595422
2   35593931    35865807
2   35868158    104785784

我想输出样本之间共有的区域。例如。如果样本1具有:

1   14900   818000

示例2:

1   15000   605000

示例3:

1   25000   705000

我想输出:

1   25000   605000

我还想包括一个多数规则,例如,如果总共20个样本中有10个具有最小区域->输出该区域。即我想让它灵活一些,需要多少个样本需要将其区域打印到输出。

有人为此提供python解决方案吗?

2 个答案:

答案 0 :(得分:3)

不确定这是否是Unix&Linux stackexchange的问题。听起来更像是一般的编程问题。

但是,我建议您考虑使用pandas

您可以将示例文件作为数据框导入,并指定标签说明,如下所示:

import pandas as pd
df = pd.read_csv('/tmp/samplefile.csv',sep='\t')

如果您知道startpos总是小于endpos,则可以通过取最大值df['startpos']和最小值df['endpos']来查找所需的输出。

答案 1 :(得分:0)

有些工具专门用于处理BED格式的数据,通过学习您会很好地为您服务。 bedtools可能是最常见且最容易使用的工具,如果您绝对需要使用python,它有python wrapper可用。

multiIntersectBed工具可能就是您想要的,并且应该非常易于使用:

用法示例:

== Input files: ==

 $ cat a.bed
 chr1  6   12
 chr1  10  20
 chr1  22  27
 chr1  24  30

 $ cat b.bed
 chr1  12  32
 chr1  14  30

 $ cat c.bed
 chr1  8   15
 chr1  10  14
 chr1  32  34

 $ cat sizes.txt
 chr1  5000

== Multi-intersect the files: ==

 $ multiIntersectBed -i a.bed b.bed c.bed
chr1    6       8       1       1       1       0       0
chr1    8       12      2       1,3     1       0       1
chr1    12      15      3       1,2,3   1       1       1
chr1    15      20      2       1,2     1       1       0
chr1    20      22      1       2       0       1       0
chr1    22      30      2       1,2     1       1       0
chr1    30      32      1       2       0       1       0
chr1    32      34      1       3       0       0       1

== Multi-intersect the files, with a header line (titles are the file names): ==

 $ multiIntersectBed -header -i a.bed b.bed c.bed
 chrom  start   end     num     list    a.bed   b.bed   c.bed
 chr1   6       8       1       1       1       0       0
 chr1   8       12      2       1,3     1       0       1
 chr1   12      15      3       1,2,3   1       1       1
 chr1   15      20      2       1,2     1       1       0
 chr1   20      22      1       2       0       1       0
 chr1   22      30      2       1,2     1       1       0
 chr1   30      32      1       2       0       1       0
 chr1   32      34      1       3       0       0       1

== Multi-intersect the files, with a header line and custom names: ==

 $ multiIntersectBed -header -i a.bed b.bed c.bed -names A B C
 chrom  start   end     num     list    A       B       C
 chr1   6       8       1       A       1       0       0
 chr1   8       12      2       A,C     1       0       1
 chr1   12      15      3       A,B,C   1       1       1
 chr1   15      20      2       A,B     1       1       0
 chr1   20      22      1       B       0       1       0
 chr1   22      30      2       A,B     1       1       0
 chr1   30      32      1       B       0       1       0
 chr1   32      34      1       C       0       0       1

== Multi-intersect the files, showing empty regions (note, requires -g): ==

 $ multiIntersectBed -header -i a.bed b.bed c.bed -names A B C -empty -g sizes.txt
 chrom  start   end     num     list    A       B       C
 chr1   0       6       0       none    0       0       0
 chr1   6       8       1       A       1       0       0
 chr1   8       12      2       A,C     1       0       1
 chr1   12      15      3       A,B,C   1       1       1
 chr1   15      20      2       A,B     1       1       0
 chr1   20      22      1       B       0       1       0
 chr1   22      30      2       A,B     1       1       0
 chr1   30      32      1       B       0       1       0
 chr1   32      34      1       C       0       0       1
 chr1   34      5000    0       none    0       0       0

然后您可以在第四列进行过滤,以满足您对区域的规定条件。