に重なるとき、私は、このようなデータセットを持っている最高の行を得る:座標
FBti0018875 2031 2045 - TTCCAGAAACTGTTG hsf 62 0.9763443383736672
FBti0018875 2038 2052 + TTCTGGAATGGCAAC hsf 61 0.96581136371138
FBti0018925 2628 2642 - GACTGGAACTTTTCA hsf 60 0.9532992561656318
FBti0018925 2828 2842 + AGCTGGAAGCTTCTT hsf 63 0.9657036377575696
FBti0018949 184 198 - TTCGAGAAACTTAAC hsf 61 0.965931072979605
FBti0018986 2036 2050 + TTCTAGCATATTCTT hsf 63 0.9943559469645551
FBti0018993 1207 1221 - TTCTAGCATATTCTT hsf 63 0.9943559469645575
FBti0018996 2039 2053 + TTCTAGCATATTCTT hsf 63 0.9943559469645575
FBti0019092 2985 2999 - TTCTAGCATATTCTT hsf 63 0.9943559469645409
FBti0019118 1257 1271 + TTCCAGAATCTTGGA hsf 60 0.9523907773798134
最初の列は識別子であり、第2および第3の座標です。私は座標の各範囲に対して1つの行を保持したいだけです。それが重複している場合に最良の識別子を保持することを意味します(最善のものは最後の列に基づいて定義され、より高い値=より優れています)。
例えば、識別子FBti0018875の場合、a)2番目の行と重複しており、b)最後の列の値がより高い(0.97> 0.96)ため、最初のものを保持します。
第1行と第2行の間に重複がない場合、私は両方を保持します。時には、各識別子に5行または6行を使うことができるので、現在のものと前のものとを比較するだけでは簡単ではありません。
これまでのところ、このコードは動作しません。
def test(lista, listb): #Compare lists of coordinates
a = 0
b = 0
found = False
while a<len(lista) and b<len(listb):
result = check(lista[a] , listb[b])
if result < 0:
a += 1
continue
if result > 0:
b += 1
continue
# we found overlapping intervals
found = True
return (found, a, lista[a], b, listb[b])
return found
def check((astart, aend) , (bstart, bend)):
if aend < bstart:
return -1
if bend < astart:
return 1
return 0
refine = open("tffm/tffm_te_hits95.txt", "r")
refined = open("tffm/tffm_te_unique_hits95.txt", "w")
current_TE=[]
for hit in refine:
info=hit.rstrip().split('\t')
if len(current_TE)==0 or info[0]==current_TE[0][0]:
current_TE.append(info)
elif info[0]!=current_TE[0][0]:
to_keep=[]
i=0
if len(current_TE)==1:
to_keep.append(0)
else:
for i in range(len(current_TE)-1):
if [current_TE[i][1], current_TE[i][2]] == [current_TE[i+1][1], current_TE[i+1][2]]:
if current_TE[i][7]<current_TE[i+1][7]:
to_keep.append(i+1)
elif test([(current_TE[i][1], current_TE[i][2])], [(current_TE[i+1][1], current_TE[i+1][2])])!='False':
if current_TE[i][7]<current_TE[i+1][7]:
to_keep.append(i+1)
try:
to_keep.remove(i)
except:
pass
else:
to_keep.append(i)
else:
to_keep.append(i)
if i==len(current_TE)-1:
to_keep.append(i+1)
for item in set(to_keep):
print current_TE[item]
current_TE=[]
同じ識別子を持つ複数の行を含むリストを生成し、解析するために、私は(コードで)しようとしている
FBti0018875 2031 2045 - TTCCAGAAACTGTTG hsf 62 0.9763443383736672
FBti0018925 2628 2642 - GACTGGAACTTTTCA hsf 60 0.9532992561656318
FBti0018925 2828 2842 + AGCTGGAAGCTTCTT hsf 63 0.9657036377575696
FBti0018949 184 198 - TTCGAGAAACTTAAC hsf 61 0.965931072979605
FBti0018986 2036 2050 + TTCTAGCATATTCTT hsf 63 0.9943559469645551
FBti0018993 1207 1221 - TTCTAGCATATTCTT hsf 63 0.9943559469645575
FBti0018996 2039 2053 + TTCTAGCATATTCTT hsf 63 0.9943559469645575
FBti0019092 2985 2999 - TTCTAGCATATTCTT hsf 63 0.9943559469645409
FBti0019118 1257 1271 + TTCCAGAATCTTGGA hsf 60 0.9523907773798134
(一方のみFBti0018875を失う)ことになる。この場合に予想される結果それは座標が重なっているもののためであり、それが最後の列に従って1つを選択する場合です。オーバーラップをチェックするのに成功しましたが、いくつかのバージョンではいくつかの行しか取得できません:
Traceback (most recent call last):
File "<stdin>", line 29, in <module>
IndexError: list index out of range
はどのように動作しませんか?あなたはあなたが期待しているものと遭遇したエラーとを比較して、あなたが得ている出力を投稿する必要があります。 –
2列目と3列目は 'FBti0018875'の座標と同じですが、'(20、31) 'と'(20,45) 'でしょうか? –
@MadPhysicist申し訳ありませんが、質問を更新するつもりです – biojl