1

ここに私の問題があります:私は新しい一般的なマトリックスを構築するためにデータを抽出するいくつかのマトリックスから始めています。最初のステップは、csvモジュールを使用してinfileを読み取り、最終的なマトリックスの列ヘッダーとして使用される「位置」値(row [1]に格納されている)を抽出することです。各インファイルには、合計「位置」のサブセットが含まれています。これは、複数のインファイルに存在する場合があります。したがって、私はまず、繰り返される値を無視して、すべての「位置」値のマージから(小さい整数から大きい整数への)順序付きリストを作成しています。これが私が行っている方法です。

for infile in glob.glob('passed_*.vcf'):
    infilen=open(infile)
    inf = csv.reader(infilen,delimiter='\t')
    for row in inf:
        if row[1] in pos:
            continue
        else:
            pos.append(row[1])
    infilen.close()
pos.sort(key=int)
head=str('\t'.join(pos))
of=open('trial.txt', 'a')   
print>>of,head

それが終わったら、元のinfileに戻り、上で作成した対応するヘッダー(つまり「position」)の下に追加したい別の値(今回はrow [3])を読み取ります。各インファイルには合計位置のサブセットが含まれているため、個々のインファイルの行[1]に最終的なマトリックス位置(リスト "pos"に格納されている)が存在しない場合は、ギャップを埋める必要があります。ここに私が試しているコードがあります:

for infile in glob.glob('passed_*.vcf'):
    infilen=open(infile)
    inf = csv.reader(infilen,delimiter='\t')
    seq=[]
    for row in inf:
        if row[1] in pos:
            seq.append(row[3])  
        else:
            seq.append('N')

言うまでもなく、私は立ち往生しています。whileループを使うことを考えていましたが、あまり経験がないので、なんらかのアドバイスをお願いしています。

サンプルデータ

入力(サンプル1):

1   2025    blah    A   .   blah    PASS    AC=0    GT:DP   0/0:61
2   2027    blah    C   .   blah    blah    AC=0    GT:DP   0/0:61
3   2028    blah    T   .   blah    PASS    AC=0    GT:DP   0/0:61

入力(サンプルn):

1   2025    blah    G   .   blah    PASS    AC=0    GT:DP   0/0:61
2   2026    blah    A   .   blah    blah    AC=0    GT:DP   0/0:61
3   3089    blah    T   .   blah    PASS    AC=0    GT:DP   0/0:61

出力(入力row [1]を変数として、row [3]を値として持つ単一の行列。各行は異なるサンプル、つまり異なる入力ファイルです):

          2025    2026    2027    2028  ...  3089
sample1    A       NaN     C       T         NaN
samplen    G        A     NaN     NaN         T
4

1 に答える 1

0
>>> from collections import defaultdict
>>> import glob
>>> pos = defaultdict(dict)
>>> for index, infile in enumerate(glob.glob('D:\\DATA\\FP12210\\My Documents\\Temp\\Python\\sample*.vcf'), 1):
    for line in open(infile):
        # Convert value in integer already
        val, letter = int(line.split()[1]), line.split()[3]
        pos[val][index] = letter


>>> def print_pos(pos):
    """ Formats pos """
    # Print header by sorting keys of pos
    values = sorted(pos.keys())
    print '          ',
    for val in range(values[0], values[-1] + 1):
        print '{0:5}'.format(val),
    print

    # pos has keys according to row1, create pos2 with keys = sample #
    pos2 = defaultdict(dict)
    for val, d in pos.iteritems():
        for index, letter in d.iteritems():
            pos2[index][val] = letter

    # Now easier to print lines
    for index in sorted(pos2.keys()):
        print ' sample{0:2} '.format(index),
        for val in range(values[0], values[-1] + 1):
            if val in pos2[index]:
                print '   {0} '.format(pos2[index][val]),
            else:
                print ' NaN ',
        print


>>> print_pos(pos)
            2025  2026  2027  2028  2029  2030  2031  2032
 sample 1     A   NaN     C     T   NaN   NaN   NaN   NaN 
 sample 2     G     A   NaN   NaN   NaN   NaN   NaN     T 
>>> 

私はpos値を収集するために使用します。また、次pos2の理由により、印刷目的で異なる順序で並べられた同じデータを含む whichも使用します。

  • pos価値志向であり、価値の範囲があると便利です
  • pos2サンプル指向で、サンプル番号が与えられた値を持つのに便利です

範囲が大きくなりすぎないように、次の値を使用しました。

-sample1.vcf:

1   2025    blah    A   .   blah    PASS    AC=0    GT:DP   0/0:61
2   2027    blah    C   .   blah    blah    AC=0    GT:DP   0/0:61
3   2028    blah    T   .   blah    PASS    AC=0    GT:DP   0/0:61

-sample2.vcf:

1   2025    blah    G   .   blah    PASS    AC=0    GT:DP   0/0:61
2   2026    blah    A   .   blah    blah    AC=0    GT:DP   0/0:61
3   2032    blah    T   .   blah    PASS    AC=0    GT:DP   0/0:61
于 2012-05-15T08:47:58.390 に答える