我现在有一组约20个单核苷酸多态性,我想获得所有可能的基因型组合。举个例子,让我们从三个snp及其等位基因开始。

SNP      A1         A2
SNP1      A          T
SNP2      C          G
SNP3      T          A

我想先列出这三个snp的所有可能的基因型排列/组合,例如:
SNP1 SNP2 SNP3
  AA   CC   TT
  AA   CC   TA
  AA   CC   AA
  AA   CG   TT
  AA   CG   TA
  AA   CG   AA
  AA   GG   TT
  AA   GG   TA
  AA   GG   AA
  ...

等等,对于我期望的3^3=27个可能的组合。
从这里开始,我希望扩大到我的20个snp在Python甚至R中,有什么好的方法可以做到这一点?

最佳答案

我们可以使用标准itertools模块中的两个函数来生成组合我们使用combinations_with_replacement从SNP构建3对。

from itertools import combinations_with_replacement

def pairs(alleles):
    return [u + v for u, v in combinations_with_replacement(alleles, 2)]

print(pairs('TA'))

输出
['TT', 'TA', 'AA']

然后我们使用product从snp列表构建所有组合。
from itertools import combinations_with_replacement, product

def pairs(alleles):
    return [u + v for u, v in combinations_with_replacement(alleles, 2)]

all_snps = ('AT', 'CG', 'TA')

for t in product(*[pairs(snp) for snp in all_snps]):
    print(t)

输出
('AA', 'CC', 'TT')
('AA', 'CC', 'TA')
('AA', 'CC', 'AA')
('AA', 'CG', 'TT')
('AA', 'CG', 'TA')
('AA', 'CG', 'AA')
('AA', 'GG', 'TT')
('AA', 'GG', 'TA')
('AA', 'GG', 'AA')
('AT', 'CC', 'TT')
('AT', 'CC', 'TA')
('AT', 'CC', 'AA')
('AT', 'CG', 'TT')
('AT', 'CG', 'TA')
('AT', 'CG', 'AA')
('AT', 'GG', 'TT')
('AT', 'GG', 'TA')
('AT', 'GG', 'AA')
('TT', 'CC', 'TT')
('TT', 'CC', 'TA')
('TT', 'CC', 'AA')
('TT', 'CG', 'TT')
('TT', 'CG', 'TA')
('TT', 'CG', 'AA')
('TT', 'GG', 'TT')
('TT', 'GG', 'TA')
('TT', 'GG', 'AA')

08-24 15:36