对于以下内容,我将不胜感激。我有一个TSV样本表:
Sample Unit Tumor_or_Normal Fastq1 Fastq2
A 1 T reads/a.t.1.fastq reads/a.t.2.fastq
A 2 N reads/a.n.1.fastq reads/a.n.2.fastq
B 1 T reads/b.t1.1.fastq reads/b.t1.2.fastq
...
并在
中读取samples = pd.read_table(config["samples"], dtype=str).set_index(["Sample", "Unit", "Tumor_or_Normal"], drop=False)
samples.index = samples.index.set_levels([i.astype(str) for i in samples.index.levels])
我想合并所有具有相同Sample和Tumor_or_Normal的bam文件。例如,C-1-T.bam和C-2-T.bam和C-3-T.bam应该合并为C-T.bam。我有规则
rule merge_recal_by_unit:
input:
expand("recal/{{Sample}}-{Unit}-{{Tumor_or_Normal}}.bam",
Unit=samples.loc[samples.Sample].Unit)
output:
bam=protected("merged/{Sample}-{Tumor_or_Normal}.bam")
params:
""
threads:
8
wrapper:
"0.39.0/bio/samtools/merge"
但是这给了InputFunctionException。我也尝试过将扩展替换为
lamblda wildcards: expand("recal/{{Sample}}-{Unit}-{{Tumor_or_Normal}}.bam",
Unit=samples.loc[wildcards.Sample].Unit)
但这给了我一个语法错误,并且
expand("recal/{{Sample}}-{Unit}-{{Tumor_or_Normal}}.bam",
Unit=samples.index.get_level_values('Unit').unique().values())
导致消息numpy.ndarray对象不可调用。这似乎类似于this和this的问题,但我无法使其正常工作。
这里的任何帮助将不胜感激。非常感谢!
答案 0 :(得分:0)
似乎您想查询示例表以获取共享相同的Sample
和Tumor_or_Normal
的所有行,并使用Unit
的列表来构造bam文件的输入列表。如果是这样,应该执行以下操作:
rule merge_recal_by_unit:
input:
lambda wc: ['recal/{Sample}-%s-{Tumor_or_Normal}.bam' % x for x in
samples[(samples.Sample == wc.Sample) & (samples.Tumor_or_Normal == wc.Tumor_or_Normal)].Unit]
output:
bam=protected("merged/{Sample}-{Tumor_or_Normal}.bam")
...