我正在从事一个生物信息学项目,该项目涉及非常大的 NarrowPeak格式文件,如下所示:
(列是 'chrom ,chromStart, chromEnd, name, score ,strand, signalValue ,pValue, qValue ,peak')
chr1 713835 714424 chr1.1 1000 . 0.1621 10.6 -1 253
chr1 752775 753050 chr1.2 567 . 0.0365 2.09 -1 124
chr1 753373 753448 chr1.3 511 . 0.0243 1.31 -1 27
chr1 762057 763210 chr1.4 1000 . 0.1743 11.5 -1 846
chr1 793358 793612 chr1.5 574 . 0.0379 2.18 -1 121
chr1 805101 805538 chr1.6 783 . 0.0834 5.23 -1 200
chr1 839626 840461 chr1.7 1000 . 0.2079 13.8 -1 510
chr1 842125 842534 chr1.8 641 . 0.0526 3.15 -1 199
chr2 846334 846381 chr1.9 510 . 0.0241 1.3 -1 17
chr2 846545 846937 chr1.10 562 . 0.0355 2.03 -1 198
chr2 848219 848588 chr1.11 605 . 0.0448 2.64 -1 179
chr2 851784 852887 chr1.12 734 . 0.0728 4.51 -1 323
我有一种方法来索引文件(在 samtools 中使用 tabix)并通过输入 chr 编号和范围并获取正确的行来查询一行(我正在使用它,因为我的队友说这是最快的方法)。
例如,如果我的查询是 chr1:713835-714424 我会得到结果:
chr1 713835 714424 chr1.1 1000 . 0.1621 10.6 -1 253
我希望能够输入 chr num 和 range 并单独获得分数 253。
我通过将结果转换为数据框(使用熊猫)来做到这一点。
def turn_query_results_into_df(query_results):
replaced=(query_results.replace('\t',','))
stripped = (replaced.strip())
lines = (replaced.split("\n") )
data=[]
for line in lines:
data.append((line.split(',')))
mydf1=pd.DataFrame(data,columns=('chrom chromStart chromEnd name score strand signalValue pValue qValue peak'.split()))
mydf1=mydf1.drop(mydf1.tail(1).index)
mydf1=mydf1.astype({'chromStart':'int32','chromEnd':'int32','score':'int32','signalValue':'float64','pValue':'float64','peak':'float64'})
return mydf1
print(peak_val = df1['peak'].values)
有没有更好的办法?
如果有使用 samtools 的方法,那将是最好的,但我很难理解它。
谢谢