Синтаксис Snakemake и pandas

У меня есть входной файл, как показано ниже

SampleName Run Read1 Read2
A run1 test/true_data/4k_R1.fq test/true_data/4k_R2.fq
A run2 test/samples/A.fastq test/samples/A2.fastq
B run1 test/samples/B.fastq test/samples/B2.fastq
C run1 test/samples/C.fastq test/samples/C5.fastq
D

Итак, я получаю все индексы в массиве:

sample_table    = pd.read_table('samples.tsv', sep=' ', lineterminator='\n')
sample_table    = sample_table.drop_duplicates(subset='SampleName', keep='first', inplace=False)
sample_table    = sample_table.dropna()
sample_table.set_index('SampleName',inplace=True)
sample_ID=sample_table.index.values

На данный момент sample_ID=['A' 'B' 'C'] это то, что я хочу. Затем я хочу установить переменную r1, которая будет соответствовать Read1 и r2 для Read2 каждой выборки.

rule all:
    input:
        expand("test/fltr/{ID_sample}.fq", ID_sample=sample_ID)

rule send_reads:
    input:
        #Tried both way but it does not work 
        r1=sample_table.loc["{ID_sample}",'Read1']
        r2=sample_table.Read2["{ID_sample}"]
    output:
       "test/fltr/{ID_sample}{input.r1}.fq"
    shell:
       "touch {output}"

Я получаю ошибку

ярлык [{ID_sample}] отсутствует в [индексе]

Это синтаксическая ошибка или большая ошибка?

Я только начинаю использовать Snakemake, я думал, что понял это после урока, но, очевидно, нет.

Большое спасибо, ура


person Eddie    schedule 11.09.2018    source источник


Ответы (1)


lambda можно использовать для получения этого значения.

input:
    lambda wildcards, output: sample_table.Read2[wildcards.ID_sample]

Кроме того, исходя из вашего rule all, ваш output должен быть test/fltr/{ID_sample}.fq. И вы должны использовать запятую для разделения двух переменных в input.

person Manavalan Gajapathy    schedule 11.09.2018
comment
@ Эдди, ты нашел элегантное решение? Было бы очень хорошо, если бы можно было просто использовать {sample} в синтаксисе pandas, но это, похоже, не поддерживается. Мне также нужно, чтобы он менял свой параметр длины чтения для каждого образца из моей таблицы образцов. Я ожидал, что это сработает: read_length = str (samples.Read1 ['{sample}']), чтобы я мог использовать {read_length} в своих скриптах (или даже: read_length = str (samples.Read1 [wildcards.sample]) ) ... Можно ли без лямбда-функции? - person Freek; 08.01.2019