我有两个文件:文件A看起来像
ProbeID rsID chr bp strand alleleA alleleB
SNP_A-1780270 rs987435 7 78599583 - C G
SNP_A-1780271 rs345783 15 33395779 - C G
SNP_A-1780272 rs955894 1 189807684 - G T
SNP_A-1780274 rs6088791 20 33907909 - A G
SNP_A-1780277 rs11180435 12 75664046 + C T
SNP_A-1780278 rs17571465 1 218890658 - A T
SNP_A-1780283 rs17011450 4 127630276 - C T
SNP_A-1780285 rs6919430 6 90919465 + A C
SNP_A-1780286 rs41528453 --- --- --- A G
SNP_A-1780287 rs2342723 16 5748791 + C T
文件B看起来像这样
ProbeID call
SNP_A-1780270 2
SNP_A-1780271 0
SNP_A-1780272 2
SNP_A-1780274 1
SNP_A-1780277 0
SNP_A-1780278 2
SNP_A-1780283 2
SNP_A-1780285 2
SNP_A-1780286 0
SNP_A-1780287 0
我想要一个类似如下的输出:
ProbeID call genotype
SNP_A-1780270 2 G G
SNP_A-1780271 0 C C
SNP_A-1780272 2 T T
SNP_A-1780274 1 A G
SNP_A-1780277 0 C C
SNP_A-1780278 2 T T
SNP_A-1780283 2 T T
SNP_A-1780285 2 C C
SNP_A-1780286 0 A A
SNP_A-1780287 0 C C
本质上,这与两个列表中的ProbeID相匹配,并且在文件B中,检查call列中相应的"call“值。当call =0时,在相邻列中打印两次alleleA的值。当call = 1时,打印alleleA和alleleB的值。当call =2时,打印两次alleleB的值。
发布于 2012-12-13 22:33:41
使用pandas
import pandas as pd
import re
A = pd.read_csv('FileA', delimiter = r'\s+')
B = pd.read_csv('FileB', delimiter = r'\s+')
A = A.set_index(['ProbeID'])
B = B.set_index(['ProbeID'])
C = pd.concat([A,B], axis = 1)
idx = C['call'] == 0
C['alleleB'][idx] = C['alleleA'][idx]
idx = C['call'] == 2
C['alleleA'][idx] = C['alleleB'][idx]
print(C[['call', 'alleleA', 'alleleB']])
收益率
call alleleA alleleB
ProbeID
SNP_A-1780270 2 G G
SNP_A-1780271 0 C C
SNP_A-1780272 2 T T
SNP_A-1780274 1 A G
SNP_A-1780277 0 C C
SNP_A-1780278 2 T T
SNP_A-1780283 2 T T
SNP_A-1780285 2 C C
SNP_A-1780286 0 A A
SNP_A-1780287 0 C C
如果您有多个B文件,则可以使用以下内容:
import pandas as pd
import re
A = pd.read_csv('FileA', delimiter = r'\s+')
A = A.set_index(['ProbeID'])
BFiles = ['FileB1', 'FileB2', 'FileB3']
for i, bfile in enumerate(BFiles):
B = pd.read_csv('FileB', delimiter = r'\s+')
B = B.set_index(['ProbeID'])
C = pd.concat([A,B], axis = 1)
idx = C['call'] == 0
C['alleleB'][idx] = C['alleleA'][idx]
idx = C['call'] == 2
C['alleleA'][idx] = C['alleleB'][idx]
cfile = 'FileC{i}'.format(i = i)
with open(cfile, 'w') as f:
f.write(C[['call', 'alleleA', 'alleleB']])
将cfile
更改为任何适当的值。
发布于 2012-12-13 21:55:43
使用嵌套字典可能很容易做到这一点:
data = {}
with open(fileA) as fA:
header = next(fA).split()
attributes = header[1:]
for line in fA:
lst = line.split()
data[lst[0]] = dict(zip(attributes,l[1:])
with open(fileB) as fB:
header = next(fB).split()
for line in fB:
ID,call = line.split()
data[ID]['call'] = int(call)
现在,您只需迭代您的数据并只打印您需要的内容。
或者,如果行完全对应,您可以使用itertools.izip
一次处理一行(如果使用Python3,则仅使用纯zip
):
import itertools as it:
with open(fileA) as fA,open(fileB) as fB:
header_a = next(fA).split()
header_b = next(fB).split()
attrib_a = header_a[1:]
attrib_b = header_b[1:]
for line_a,line_b in it.izip(fA,fB):
dat_a = line_a.split()
dat_b = line_b.split()
assert(dat_a[0] == dat_b[0]) #make sure they're the same ID
dat = dict(zip(attrib_a,dat_a[1:]))
dat.update(zip(attrib_b,dat_b[1:]))
if (dat['call'] == '0'):
print dat_a[0],dat['call'],dat['alleleA'],dat['alleleA']
elif (dat['call'] == '1'):
print dat_a[0],dat['call'],dat['alleleA'],dat['alleleB']
elif (dat['call'] == '2'):
print dat_a[0],dat['call'],dat['alleleB'],dat['alleleB']
else:
raise AssertionError("Unknown call")
发布于 2012-12-17 21:55:52
这是一个R解决方案。
my.data <- merge(df1, df2, by = "ProbeID")
# select rows based on call
zero <- my.data$call == 0
one <- my.data$call == 1
two <- my.data$call == 2
# subset rows based on previous condition and calculate genotype
my.data[zero, "genotype"] <- paste(my.data$alleleA[zero], my.data$alleleA[zero], sep = " ")
my.data[one, "genotype"] <- paste(my.data$alleleA[one], my.data$alleleB[one], sep = " ")
my.data[two, "genotype"] <- paste(my.data$alleleB[two], my.data$alleleB[two], sep = " ")
my.data[, c("ProbeID", "call", "genotype")]
ProbeID call genotype
1 SNP_A-1780270 2 G G
2 SNP_A-1780271 0 C C
3 SNP_A-1780272 2 T T
4 SNP_A-1780274 1 A G
5 SNP_A-1780277 0 C C
6 SNP_A-1780278 2 T T
7 SNP_A-1780283 2 T T
8 SNP_A-1780285 2 C C
9 SNP_A-1780286 0 A A
10 SNP_A-1780287 0 C C
https://stackoverflow.com/questions/13861202
复制相似问题