Snakemake не читает полный файл в R? - PullRequest
1 голос
/ 21 апреля 2020

Я использую некоторый быстрый R-скрипт для привязки файлов после выполнения количественной оценки (kallisto / salmon). Проблема в том, что я получаю ошибку R, в которой говорится, что мои входные файлы имеют разную длину, поэтому cbind () не будет работать.
Это, очевидно, не тот случай, все они имеют 16887 строк (проверено с помощью bash w c), и он отлично работает в R без создания змеи.

Также стоит упомянуть, я получаю вывод для случайного числа выборок (~ 1 до 4).

Вот код R:

sample <- read.table(snakemake@input[[1]], sep = "\t", header = TRUE)
if (!file.exists(snakemake@params[[1]])) {
  merge <- data.frame(sample)
} else {
  merge1 <- read.table(snakemake@params[[1]], sep = "\t", header = TRUE)
  merge <- cbind(merge1, sample[,2, drop=F])
}
write.table(merge, snakemake@params[[1]], sep = "\t", quote = F, row.names = F)
file.create(snakemake@output[[1]])

И правило змейки:

rule merge_quantif:
        input:
            QUANTIF+"/{sample}/quantif.txt"
        output:
            QUANTIF+"/{sample}/merge.done"
        params:
            QUANTIF+"/all_sample_quantified.txt"
        script:
            "Tools/merge_quantif.R"

Мои файлы такие:

Gene    R1
A1BG    0.287571
A1CF    0
A2M 0.198756
A2ML1   0
A2MP1   0
A3GALT2 0
A4GALT  3.098108

И вывод должен быть таким , но со всеми 17 сэмплами

Gene    R4  R8  R15 R13
A1BG    0.337515    0.284943    0.488654    0.587114
A1CF    0   0   0   0
A2M 0   0   0.105159    0.009539

Если у кого-нибудь есть идея разобраться в этом, с радостью оценят.

------------ EDIT Modified Код R до go с ответом:

sample <- snakemake@input

merge <- read.table(sample[[1]], sep = "\t", header = T)
for (i in 2:length(sample)) {
  x <- read.table(sample[[i]], sep = "\t", header = T)
  merge <- merge(merge, x, by="Gene")
}

write.table(merge, snakemake@output[[1]], sep = "\t", quote = F, row.names = F)

1 Ответ

4 голосов
/ 21 апреля 2020

Проблема, я думаю, в том, что правило merge_quantif выполняется для каждого образца, то есть 17 раз, возможно параллельно. Однако каждый прогон merge_quantif записывает в один и тот же выходной файл (QUANTIF+"/all_sample_quantified.txt"), так как в вашем R-скрипте у вас есть write.table(merge, snakemake@params[[1]], ...). Я подозреваю, что это вызывает проблемы или, по крайней мере, не является идеальной установкой. Я подозреваю, что вам нужно что-то вроде:

rule merge_quantif:
        input:
            expand(QUANTIF+"/{sample}/quantif.txt", sample= list_of_samples)
        output:
            QUANTIF+"/all_sample_quantified.txt"
        script:
            "Tools/merge_quantif.R"

Где Tools/merge_quantif.R читает список входных файлов один за другим, объединяет их и, наконец, записывает объединенный файл в QUANTIF+"/all_sample_quantified.txt"

...