Snakemake中如何求glob_wildcards生成集合的并集
解决Snakemake中合并fastq与组装序列样本集合的问题
嘿,我知道你为啥用union()不行了——Snakemake自带的那个union()函数根本不是用来合并Python集合的,它是给规则里的输入输出通配符扩展用的!而你已经把FASTQ和GENOMES转成了Python原生的set类型,直接用Python集合的合并方法就搞定了。
两种可行的写法
你可以二选一来合并这两个集合:
- 用Python集合自带的
union()方法:
SAMPLES = FASTQ.union(GENOMES)
- 用更简洁的集合运算符
|(管道符),效果和上面完全一致:
SAMPLES = FASTQ | GENOMES
完整的修改后代码
把你的代码改成这样就可以正常运行了:
# 替换成你实际的文件路径 unzip_res = "path/to/your/unzipped_fastqs/" renaming_res = "path/to/your/assembled_genomes/" # 获取fastq样本集合 FASTQ, = glob_wildcards(unzip_res + "{fastq}_R1.fastq") FASTQ = set(FASTQ) # 获取组装序列样本集合 GENOMES, = glob_wildcards(renaming_res + "{genomes}.fasta") GENOMES = set(GENOMES) # 合并得到所有样本集合 SAMPLES = FASTQ | GENOMES # 或者用 FASTQ.union(GENOMES)
额外小技巧
如果需要样本列表是有序的(方便后续规则执行更稳定),可以把结果转成排序后的列表:
SAMPLES = sorted(FASTQ | GENOMES)
再补充一句:Snakemake的union()函数是用来处理规则中的通配符模式的,比如你在规则输入里写input: union("data/{sample}_R1.fq", "refs/{sample}.fasta"),它会把两种通配符匹配到的结果合并,但这和你手里的Python集合完全是两码事哦~
内容的提问来源于stack exchange,提问作者JoergL
相关产品推荐
相关产品推荐

