Nextflow技术问题:如何基于单个值过滤整个tuple并移除失败样本
问题描述
我需要基于单个值过滤整个tuple的指导。我有一个包含tuple的通道reads_ch,示例如下:
[[id:S1, single_end:false], [/home/ubuntu/S1.R1.fastq.gz, /home/ubuntu/S1.R2.fastq.gz], /home/ubuntu/S1.txt, [PASSED: File S1_R1 is not corrupt., PASSED: File S1_R2 is not corrupt.]] [[id:S2, single_end:false], [/home/ubuntu/S2.fastq.gz, /home/ubuntu/S2.R2.fastq.gz], /home/ubuntu/S2.txt, [PASSED: File S2_R1 is not corrupt., PASSED: File S2_R2 is not corrupt.]] [[id:S3, single_end:false], [/home/ubuntu/S3.R1.fastq.gz, /home/ubuntu/S3.R2.fastq.gz], /home/ubuntu/S3.txt, [FAILED, FAILED]]
我想过滤掉所有包含FAILED状态的样本,但目前只能清空tuple的结果状态部分,无法移除整个样本,同时保留剩余样本(S1、S2)的结构。
预期目标:
[[id:S1, single_end:false], [/home/ubuntu/S1.R1.fastq.gz, /home/ubuntu/S1.R2.fastq.gz], /home/ubuntu/S1.txt, [PASSED: File S1_R1 is not corrupt., PASSED: File S1_R2 is not corrupt.]] [[id:S2, single_end:false], [/home/ubuntu/S2.fastq.gz, /home/ubuntu/S2.R2.fastq.gz], /home/ubuntu/S2.txt, [PASSED: File S2_R1 is not corrupt., PASSED: File S2_R2 is not corrupt.]]
我的尝试代码:
passing = read_ch.map { meta, reads, outcome_file, outcome_status -> tuple(meta, reads, outcome_file, outcome_status.findAll { !it.contains('FAILED') }) } passing.view()
执行结果:
[[id:S1, single_end:false], [/home/ubuntu/S1.R1.fastq.gz, /home/ubuntu/S1.R2.fastq.gz], /home/ubuntu/S1.txt, [PASSED: File S1_R1 is not corrupt., PASSED: File S1_R2 is not corrupt.]] [[id:S2, single_end:false], [/home/ubuntu/S2.fastq.gz, /home/ubuntu/S2.R2.fastq.gz], /home/ubuntu/S2.txt, [PASSED: File S2_R1 is not corrupt., PASSED: File S2_R2 is not corrupt.]] [[id:S3, single_end:false], [/home/ubuntu/S3.R1.fastq.gz, /home/ubuntu/S3.R2.fastq.gz], /home/ubuntu/S3.txt, []]
希望得到正确的过滤方法,移除包含FAILED状态的整个tuple。
解决方案
使用filter操作符替代map即可直接移除不符合条件的tuple,map用于转换元素结构,而filter专门负责筛选保留符合条件的元素。
具体实现代码:
passing = read_ch.filter { meta, reads, outcome_file, outcome_status -> // 仅保留状态列表中无FAILED的tuple !outcome_status.any { it.contains('FAILED') } } passing.view()
代码说明
filter闭包返回true时保留当前tuple,返回false则丢弃该tuple。outcome_status.any { it.contains('FAILED') }检查状态列表中是否存在FAILED,取反后表示没有FAILED时才保留该样本的完整tuple。
执行后会直接移除S3的整个tuple,仅保留S1、S2的完整结构,完全符合预期目标。
内容的提问来源于stack exchange,提问作者Samantha Sevilla
相关产品推荐
相关产品推荐

