我有多个示例文件(> 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解决方案吗?
答案 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
然后您可以在第四列进行过滤,以满足您对区域的规定条件。