1

私は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]をリストに追加する必要があります。

それをもっとよく説明する必要があるかどうか教えてください。

よろしくお願いします。よろしくお願いします!

4

3 に答える 3

4

新しい言語を使い始めるのは難しく、どこかから始めなければなりません。幸いなことに、Python を選択したので、Python コマンド ラインが用意されています。それを使用して、列の作成方法などをテストできます。

まず、入力ファイルを読み込み、各行の情報を処理する必要があります。Python CSV モジュールは優れています。私は水道事業プロジェクトのいたるところでそれを使用し、その後、.csv 処理を必要とする他の多くのプロジェクトで使用しました。

しかし、タブ区切りのファイルがあります。区切り文字をタブに設定して、タブ区切りファイルで機能することを確認したことはありません。それがうまくいかない場合 (Python コマンド ラインでテストできます)、回避策として、タブ区切りファイルを sed にパイプし、タブをコンマに変換します。

列、行の表現に関しては、Python ではリストのリストが必要です。つまり、[[1,2][3,4]...] が必要です。

Python のリストは可変であるため、リストに追加できます。リストのリストを空のリストに初期化します

lol = []

次に、必要な列の数に応じて、lol にリストを追加する必要があります。演習として、2 列の行を数字だけでまとめるとすると、次のようにします。

lol.append([1,2])
lol.append([3,4])
lol.append([5,6])

>>> lol
[[1, 2], [3, 4], [5, 6]]
于 2012-06-10T14:07:34.570 に答える
1

問題をリスト内包表記に関連付けて、行列の行を列に変換できます。

ここに画像の説明を入力

于 2015-05-09T12:23:38.003 に答える
1

何ができるかについてのアイデアを提供するコードを次に示します。付属品は省略し (たとえば、最初の 3 つif'sはループ内でより適切に実行できるなど)、必要最小限のコードのみを示します。ファイル「chr.txt」から読み取り、次の場所に書き込みますstdout

def readTabbedFile(filename):
    out = {}
    file = open(filename, 'r')
    for line in file.readlines():
        line = line.rstrip('\n\r')
        parsedLine = line.split('\t')
        if not parsedLine[1] in out:
            out[parsedLine[1]] = {}
        if not parsedLine[2] in out[parsedLine[1]]:
            out[parsedLine[1]][parsedLine[2]] = {}
        if not parsedLine[3] in out[parsedLine[1]][parsedLine[2]]:
            out[parsedLine[1]][parsedLine[2]][parsedLine[3]] = []

        out[parsedLine[1]][parsedLine[2]][parsedLine[3]].append(parsedLine[9])

    for key0 in out.keys():
        for key1 in out[key0].keys():
            for key2 in out[key0][key1].keys():
                outStr = key0 + "\t" + key1 + "\t" + key2 + "\t"
            for val in out[key0][key1][key2]:
                outStr += "\t" + val
                print(outStr)

    file.close()

if __name__ == '__main__':
    readTabbedFile("chr.txt")
于 2012-06-10T14:49:06.750 に答える