Python 方法获得一组SNP的所有可能的基因型组合

Python 方法获得一组SNP的所有可能的基因型组合,python,r,combinations,permutation,Python,R,Combinations,Permutation,我现在有一组大约20个SNP,我想获得所有可能的基因型组合。例如,让我们从三个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 T

我现在有一组大约20个SNP,我想获得所有可能的基因型组合。例如,让我们从三个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
模块中的两个函数来生成组合。我们使用一个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']
('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')
   SNP1 SNP2 SNP3
1    AA   CC   TT
2    AT   CC   TT
3    TT   CC   TT
4    AA   CG   TT
5    AT   CG   TT
6    TT   CG   TT
7    AA   GG   TT
8    AT   GG   TT
9    TT   GG   TT
10   AA   CC   TA
11   AT   CC   TA
12   TT   CC   TA
13   AA   CG   TA
14   AT   CG   TA
15   TT   CG   TA
16   AA   GG   TA
17   AT   GG   TA
18   TT   GG   TA
19   AA   CC   AA
20   AT   CC   AA
21   TT   CC   AA
22   AA   CG   AA
23   AT   CG   AA
24   TT   CG   AA
25   AA   GG   AA
26   AT   GG   AA
27   TT   GG   AA
然后,我们使用从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)
输出

['TT', 'TA', 'AA']
('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')
   SNP1 SNP2 SNP3
1    AA   CC   TT
2    AT   CC   TT
3    TT   CC   TT
4    AA   CG   TT
5    AT   CG   TT
6    TT   CG   TT
7    AA   GG   TT
8    AT   GG   TT
9    TT   GG   TT
10   AA   CC   TA
11   AT   CC   TA
12   TT   CC   TA
13   AA   CG   TA
14   AT   CG   TA
15   TT   CG   TA
16   AA   GG   TA
17   AT   GG   TA
18   TT   GG   TA
19   AA   CC   AA
20   AT   CC   AA
21   TT   CC   AA
22   AA   CG   AA
23   AT   CG   AA
24   TT   CG   AA
25   AA   GG   AA
26   AT   GG   AA
27   TT   GG   AA

以下是针对您提供的示例的R中的解决方案:

# Alleles for each SNP
alleles <- data.frame(
  A1 = c("A", "C", "T"),
  A2 = c("T", "G", "A"),
  row.names = paste0("SNP", 1:3)
)

# Get the three possible genotypes for each SNP (diallelic loci)
genotypes <- apply(alleles, 1, function(x) {
  paste0(x[c(1, 1, 2)], x[c(1, 2, 2)])
})  

# Generate all possible combinations
expand.grid(as.data.frame(genotypes))

3^20几乎是35亿。你有这么大的名单吗?yoj需要一次完整的列表吗,或者你可以只迭代组合?或者可能妥协,使用整个列表的小部分?顺便说一句,itertools.product可以用来生成这些组合。谢谢!简单地看一下itertools.product,我似乎可以使用它。我不太确定我是否有适当数量的RAM,但可以在列表的各个部分工作。在此之后,我只想计算两个值:(I)基于每个snp中存在的每个风险等位基因的已公布对数优势比总和的得分,以及(ii)基于1000G数据中已知等位基因频率的每个组合的频率。Ok。听起来你不需要把整个列表都保存在RAM中。我将很快发布一些代码来生成这些组合。