1

タイトルが私の問題に対して曖昧であり、よりわかりやすい方法でそれを表現できないことを認めます。私はプログラミングが初めてで、技術用語はまだ発展途上です。

2 つのファイルがあり、ファイルAは次のようになります。

CHROM   POS ID  AGM12   AGM14   AGM15   AGM18 ..
1   14930   rs150145850     0/0 1/1 0/0  0/0 ..
1   14933   rs138566748 0/0 0/0 0/0  0/0 ..
1   63671   rs116440577 0/1 0/0 0/0  0/0 ..
2   808922  rs6594027   0/0 0/0 0/0  0/1 ..
2   753474  rs2073814   1/0 0/0 0/1  0/0 ..
3   753405  rs61770173  0/0 1/1 0/0  1/0 ..
...
...
...

ファイルBは次のようになります。

CHROM   POS rsID    Sample_ID
1   14930   rs150145850 AGM15
2   808922  rs6594027   AGM18
3   753405  rs61770173  AGM12
...
...
...

ファイル内のPOS フィールド情報 (列 2) を使用して、対応するファイルB内のコンテンツを.Sample_IDANA

例: 出力は次のようになります。

CHROM   POS ID  AGM12   AGM14   AGM15   AGM18
1   14930   rs150145850     0/0 1/1 NA   0/0
1   14933   rs138566748 0/0 0/0 0/0  0/0
1   63671   rs116440577 0/1 0/0 0/0  0/0
2   808922  rs6594027   0/0 0/0 0/0  NA
2   753474  rs2073814   1/0 0/0 0/1  0/0
3   753405  rs61770173  NA  1/1 0/0  1/0

Python または Unix でこれを行うにはどうすればよいですか?

4

3 に答える 3

1

csvモジュールを使用するバージョンを次に示します (列はタブで区切られていると想定しています)。

import csv
import collections

a = 'path/to/a'
b = 'path/to/b'
output = 'output/path'

pos = collections.defaultdict(list)

with open(b) as csvin:
    reader = csv.DictReader(csvin, delimiter='\t')
    for line in reader:
        pos[line['POS']].append(line['Sample_ID'])

with open(a) as csvin, open(output, 'wb') as csvout:
    reader = csv.DictReader(csvin, delimiter='\t')
    writer = csv.DictWriter(csvout, fieldnames=reader.fieldnames, delimiter='\t')
    writer.writeheader()
    for line in reader:
        fields = pos.get(line['POS'], [])
        for field in fields:
            line[field] = 'NA'
        writer.writerow(line)
于 2012-11-22T15:13:36.330 に答える
0

いくつかのパッケージをインストールしてもかまわない場合は、次のようにすれば簡単にインストールできますpandas

A = pandas.DataFrame.from_csv("A.txt", sep="\t", index_col=(0,1))
B = pandas.DataFrame.from_csv("B.txt", sep="\t", index_col=(0,1))

A.join(B) # the resulting dataset

もちろん、pandasこれを行うには拾う必要があります。

于 2012-11-22T14:29:18.433 に答える
0

これを試してみてください。

def method(file1, file2, fileout):
    d1, d2, headers = {}
    i = 1
    with open(file1) as f1:  
        for line in f1:
            vars = line.split('\t') #i am assuming tab seperated
            d1[vars[1]] = [vars[0]] + vars[2:]
    with open(file2) as f2:
        for line in f2:
            vars = line.split('\t')
            d2[vars[1]] = vars[2]
    for header in d1['POS']:
        headers[header] = i
        i+=1
    with open(fileout, 'w') as fo:
        fo.write("%s\tPOS\t%s\n" % (d1['POS'][0], "\t".join(d1['POS'][1:]))
        del d1['POS']         
        for key, values in d1.items():
            if key in d2:
                d1[key][headers[d2[key]]] = "NA"
            fo.write("%s\t%s\t%s\n" % (values[0], key, "\t".join(values[1:])))
于 2012-11-22T14:20:38.713 に答える