2017-04-05 3 views
1

2つのファイルがあります。ポジションがPythonを使用してリージョン内にあるかどうかを確認するには

ファイルAには、染色体、開始位置、終了位置の3つの列があります。

CHR,START,END 
chr1,1203245,1203374 
chr1,1202020,1202213 
chr1,1201293,1201465 
chr1,1200844,1201128 
chr1,1200527,1200585 

ファイルBは、2つの列、すなわち、染色体、位置を有する。

CHR,POS 
chr1,1579264 
chr1,1641372 
chr1,3020521 
chr2,2097836 
chr3,2374462  

両方のファイルが大きい。

ファイルBのすべての位置がファイルAのどの領域にあるかをPythonを使用して決定する方法を教えてください。 1つの位置と1つの領域があればコードを書くことができますが、領域のリストの手掛かりはありません。

Position is in a regionCHRが同じになるとPOS >= START and POS <= ENDなければならないこと、例えば、ファイルBのchr1,1203250は、ファイルのchr1,1203245,1203374私はoscarbransonのアドバイスを取り、コードを書く

にする必要があります:

for i,r in B.iterrows(): 
    B.loc[i, 'in_A'] = any((r.CHR == A.CHR) & (r.POS >= A.SATRT) & (r.POS <= A.END)) 

しかし2の両方ファイルが大きく、コードはまだ実行されています。これをもっと速くする方法があれば?

+0

質問を編集して、入力と出力の例を教えてください。 –

+0

私は正規表現がすると思います。例を示すために、POS列とSTART/ENDの関係が何であるかを知る必要があります。あなたは、マッチが何であるかを説明して、あなたの質問を再び更新するのに十分親切でしょうか? –

答えて

0
  1. ファイルが大きい場合、それはあなたの全体のメモリを埋めると同じように、あなたがだけで、データフレームの両方をロードできないすることができます。

  2. Do は、Aのすべての間隔とBの位置を比較します。これは非常に非効率的なためです(非常に非常に遅いと理解してください)。

代わりに、この操作を行います。CHROMによって両方のファイルは、起動

  1. 並び替え、最後に。

  2. 両方のファイルの行を同時に反復処理します。

    a = open("A") 
    b = open("B") 
    # init 
    (chromA,start,end) = a.readline().split(",") 
    (chromB,pos) = b.readline().split(",") 
    while 1: 
        try: 
         if pos < start: 
          # Read more lines from B 
          (chromB,pos) = b.readline().split(",") 
         elif pos > end: 
          # Read more lines from A 
          (chromA,start,end) = a.readline().split(",") 
         else: 
          # Pos is in the [start, end] interval 
          # Save the result and go to the next pos 
          savePos() 
          (chromB,pos) = b.readline().split(",") 
        except StopIteration: 
         break 
    

私の本当のアドバイス:;この(それは考慮に染色体を取ら​​ない、そしてそれにバグを持っていることに加え、あなたが位置を保存する方法を定義する必要があるという考えのため)のようなもの過去のあらゆる生物情報学者のように手動で行うのではなく、 "bedtools"やBioPythonのような既存のPythonライブラリを使うことです。ホイールを改革することは、研究のための時間とリソースのひどい損失です。

-1

私はあなたの質問を「Aのすべての行のSTART値とEND値の間のBの各行にあるPOS値ですか」と解釈しました。それが正しいなら、このようなものはpandasデータ解析ライブラリを使用して、動作します:Bのすべての行を通じて

import pandas as pd 

A = pd.read_csv('path/to/A.csv') 
B = pd.read_csv('path/to/B.csv') 

for i, r in B.iterrows(): 
    B.loc[i, 'in_A'] = any((r.POS > A.START) & (r.POS < A.END)) 

print(B) 

>>  CHR  POS in_A 
    0 chr1 1579264 False 
    1 chr1 1641372 False 
    2 chr1 3020521 False 
    3 chr2 2097836 False 
    4 chr3 2374462 False 

この反復処理し、そして(POS> START)TRUEであるブール配列を生成&(POS < END)を返します。その後、Bデータフレームに新しい列が作成されます。これは、POSが内に存在する場合はTrueです。

意味がありますか?

+0

ありがとうございました。 B.loc [i、 'in_A'] = any((r.CHR == A.CHR)&(r.POS> = A.SATRT)&(r.POS <= A. END)) '、しかしそれは遅すぎる。これをより速くするためのアドバイスはありますか? – kelloggs

+0

この回答は、他のファイルのすべての間隔とすべての位置を比較しているため、長さ(A)x長さ(B)のように大きくなります。以前にファイルをソートすると、もっと巧妙なものを思いつくことができます。そして、両方のファイルがメモリに完全にロードされます。 OPは彼らが "大"であると言い、本当にそうだったらこれは決してうまくいかないでしょう。 – JulienD

関連する問題