私はPythonの初心者で、タブ区切りのテキストファイルを入力として使用して、指定された行を列に変換するスクリプトを作成しようとしています。ファイル内の行の例を次に示します。
1 chr1 1008376 1258657 250281 4628 666 2832 565 16.6323226376 83.3676773624
1 chr1 1258657 1516806 258149 2544 601 1481 231 13.4929906542 86.5070093458
1 chr1 1516806 1766886 250080 1652 590 936 63 6.30630630631 93.6936936937
1 chr1 1766886 2017159 250273 5030 1608 2698 362 11.8300653595 88.1699346405
基本的に、ファイルは個人(列0)の染色体(列1)の領域のリスト(列2-3)を通過し、その領域(列9)に対して計算された統計を提供します。このファイルには、最初に個人1、次に2のすべての地域がリストされ、最後の個人までリストされます。ファイルには20人の個人がいます。列0または4-8を含まず、各個人のその行(現在は列1-2)の領域のスコアである新しい列を持つ新しいファイルが必要です。したがって、個人1の場合、列3は以前の列9であり、列4は個人2のその領域のスコアになります。したがって、各行には列0として列2(chr1)があり、領域スコア(列1-2)の後の20列は、20人の各個人のスコアです。現在、スコアは行になっているため、ファイルには多くの行があります。列1〜3の各個人の値は同一であるため、領域が重複していないという問題はありません。また、すべての個人が同じ数の行を持っています。つまり、列2+3はファイル内で20回複製されます。
それが複雑すぎる/密度が高い場合、以下の説明は問題を説明するための簡略化された例です。
これが私が欲しいものの簡単なダミーの例です:
元のファイル:
1 chr1 10 20 30423
1 chr1 20 30 40556
2 chr1 10 20 73476
2 chr1 20 30 43657
3 chr1 10 20 34656.5
3 chr1 20 30 90848
に変更されました:
chr1 10 20 30423 73476 34656.5
chr1 20 30 40556 43657 90848
したがって、Pythonユーザーが行を列に変換するためのヒントを持っている場合、この問題を具体的に解決する時間がなくても、行から列への変換は特に難しい問題であることがわかります。列(ここでは列0)の値を条件とします。
問題を明確にできるかどうか教えてください。ヘルプやコメントをいただければ幸いです。
更新:すべてのコメントに感謝します。これまでに私が思いついたものは次のとおりです。
ListofData = [] # make list
individual=1 # only interested in first individual to get list of windows for the chromosome
for line in file('/mnt/genotyping/Alex/wholegenome/LROH/LROHSplitbyChrom/Filtered_by_MappingQuality20/SimpleHomozygosityScore/HomozygosityStatisticsTameratsalllanesMinMQ20chr20'):
line = line.rstrip()
fields = line.split("\t")
if "chr" in line: #avoids header
if int(fields[0]) == individual:
ListofData.extend(fields[2:5]) # add start, end and size of window to list
else: # once iterated through windows, split the list into sets of three, making it one list per line
lol = [ListofData[i:i+3] for i in range(0, len(ListofData), 3)] #list of lists divided into 3's
smallcounter = 0
for i in lol: #for set of 3 in list
for line in file('/mnt/genotyping/Alex/wholegenome/LROH/LROHSplitbyChrom/Filtered_by_MappingQuality20/SimpleHomozygosityScore/HomozygosityStatisticsTameratsalllanesMinMQ20chr20'):
if "chr" in line: # avoids header
line = line.rstrip()
fields = line.split("\t")
if str(fields[2]) == lol.pop(0): #if start position in line matches start position in i
i.extend(fields[9]) #add homozygosity score to list
counter = counter + 1
if smallcounter == 20: #if gone through all individuals in file
smallcounter = 0 #reset counter for next try
print i
ファイルを調べて、2〜4列目に必要な情報を取得し、リストに追加しました。次に、このリストを各行に対応する3つのグループに分割しました。次に、2番目のループで、リスト内の3つのセットごとに(つまり、リスト内のリストごとに)ファイルを調べ、リストの最初の位置がファイルの開始位置と同じであるかどうかを確認しようとしています( fields [2])次に、fields[9]のスコアをそのリストに追加します。次に、リストを次々に印刷して、自分が求めているものを取得するだけです。しかし、私はラインに問題があります:
if str(fields[2]) == lol.pop(0):
Pythonにリストの最初の位置(元々はfields [2])を調べて、ループしている行のfields[2]の位置と同じかどうかを尋ねます。その場合は、fields[9]をリストに追加する必要があります。
それをもっとよく説明する必要があるかどうか教えてください。
よろしくお願いします。よろしくお願いします!