我有一个包含独特蛋白质对的文件,即阳性数据集。我们称之为infile
。
下面是一个infile内容的例子:
Q9VRA8 A1ZBB4
Q03043 Q9VX24
B6VQA0 Q7KML2
条目以制表符分隔。
随机数据集,我们称之为outfile
,必须包含单个蛋白质的组合,其方式是它们无法以任何顺序匹配的内容。例如,对于上面的第一行,随机化的outfile不能包含以下对:
Q9VRA8 A1ZBB4
A1ZBB4 Q9VRA8
此外,生成的阴性数据集必须包含正数据集中完全相同数量的蛋白质对。 为了解决这个问题,我尝试了以下方法:
# Read original file
data = list(infile.readlines())
ltotal = len(data)
lwritten = 0
# Split original file in words
with open (infilename, 'rt') as infile:
pairs = set(frozenset(line.split()) for line in infile)
words = list(itertools.chain.from_iterable(pairs))
random.shuffle(words)
# Obtain pairs of words
with open(outfilename, 'wt') as outfile:
for pair in itertools.izip(*[iter(words)] * 2):
if frozenset(pair) not in pairs and lwritten != ltotal:
outfile.write("%s\t%s\n" % pair)
lwritten += 1
这很有效。然而,infile总共有856471行,outfile获得不同范围的蛋白质对,最小值为713000。
我如何解决这个问题,因此产生的对数与infile完全相同? 另外,我无法解决反向对订单问题。这两个问题都有想法吗?
提前致谢。
答案 0 :(得分:3)
对于独立于订单的否决对,我只是将两个订单放入我的对列表中:
即我将line.split()
和line.split()[::-1]
添加到对的集合中。
要生成更多对,而不是迭代单词列表,只需选择随机对(可能使用random.choice
?)然后根据无效对列表对其进行否决(您可能还需要考虑生成“A1ZBB4 A1ZBB4”对并适当行动的情况。只要你愿意,你就可以继续这样做。由于您需要确保输出仅包含唯一元素,因此输出项可以在生成时添加到否决列表中(或作为单独的否决列表进行维护)。
如果您想减少内存占用,可以设置:
pairs
是否决对的集合,但每对都在内部排序,即如果您读取“Q9VRA8 A1ZBB4”,则将其存储为“A1ZBB4,Q9VRA8”对。</ li>