4

我有一个包含独特蛋白质对的文件,即阳性数据集。让我们称之为infile。下面是 infile 内容的示例:

Q9VRA8  A1ZBB4
Q03043  Q9VX24
B6VQA0  Q7KML2

条目是制表符分隔的。我们称之为随机数据集,它outfile必须包含单个蛋白质的组合,它们不能以任何顺序匹配 infile 的内容。例如,对于上面的第一行,随机输出文件不能包含以下对:

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 完全相同?此外,我无法解决反向配对顺序问题。对这两个问题有什么想法吗?

提前致谢。

4

1 回答 1

3

要否决与顺序无关的配对,我只需将两个顺序都放入我的配对列表中:即我将添加:line.split()line.split()[::-1]到配对集合中。

要生成更多对,而不是遍历单词列表,只需选择随机对(使用random.choice可能?),然后根据无效对列表否决它们(您可能还需要考虑生成对“A1ZBB4”的情况A1ZBB4" 并采取适当的行动)。只要你愿意,你就可以一直这样做。由于您需要确保输出仅包含唯一元素,因此可以在生成时将输出项添加到否决列表(或作为单独的否决列表维护)。

如果要减少内存占用,可以设置:

  • pairs是要否决的对集合,但每一对都是内部排序的,即如果您阅读“Q9VRA8 A1ZBB4”,则将其存储为“A1ZBB4,Q9VRA8”对。
  • you generate random pairs above, check to see if the sorted version of that pair is in your veto list, if so ignore it.
于 2012-07-30T14:10:21.313 回答