Перебор нескольких файлов с использованием алгоритма множественного ввода с трехзначными числами в R

Я использую программное обеспечение для генетической интерпретации под названием SAIGE-GENE. Алгоритм выглядит так (полный алгоритм на https://github.com/weizhouUMICH/SAIGE/wiki/Genetic-association-tests-using-SAIGE#step-2--performing-the-region--or-gene-based-association-tests): он включает в себя ввод нескольких разных файлов с номерами хромосом в именах файлов (от 1 до 22).

SPAGMMATtest = function(
         vcfFile = "",
                 vcfFileIndex = "",
         vcfField = "DS",
         groupFile ="",
         savFile = "",
         savFileIndex = "",
         sampleFile = "", 
         idstoExcludeFile = "",
         idstoIncludeFile = "",
         rangestoExcludeFile = "",
         rangestoIncludeFile = "",
         chrom = "",
         start = 1,
         end = 250000000,
         IsDropMissingDosages = FALSE,  
         minMAC = 0.5, 
                 minMAF = 0,
         maxMAFforGroupTest = 0.5,
             minInfo = 0,
                 GMMATmodelFile = "", 
                 varianceRatioFile = "", 
                 SPAcutoff=2, 
                 SAIGEOutputFile = "",
         numLinesOutput = 10000, 
         IsSparse=TRUE,

......

Я не помещал все это здесь, поскольку это не относится к делу. Я ввожу в этот алгоритм несколько разных файлов и обычно называю свои файлы chr1_file_name.txt....chr22_file_name.txt.

Затем я использую цикл for в R для всего алгоритма, используя функцию вставки для ввода разных имен файлов по номеру хромосомы:

for(i in 1:22){SPAGMMATtest = function(
         vcfFile = paste("chr",i,"_file_name.txt", sep=""),
                 vcfFileIndex = "",
         vcfField = "DS",
         savFile = "",
         groupFile ="paste("chr",i,".group_file.txt", sep="")",

так далее

Это прекрасно работает, однако я подумал, что буду умнее и буду использовать трехзначное имя для имен моих файлов для этого эксперимента: chr001_file_name.txt...chr022_file_name.txt.

Мой предыдущий цикл теперь не работает, и если я изменю начало цикла на for(i in 001:022), он тоже не сработает.

Что я делаю не так и как это исправить, не переименовывая все мои файлы?


person tacrolimus    schedule 17.08.2020    source источник
comment
попробуйте: vcfFile = paste("chr",sprintf( "%03d", i),"_file_name.txt", sep=""), отредактируйте: для более короткого кода вы можете использовать paste0() и отбросить sep-аргумент...   -  person Wimpel    schedule 17.08.2020
comment
спасибо Wimpel Я думаю, что это сработало (на это уходит много времени!). Вы придерживаетесь (i в 1:22) в петле тогда? Означает ли %03d один ноль, а затем i до трех цифр?   -  person tacrolimus    schedule 17.08.2020
comment
%03d означает: преобразовать в три цифры, добавить ведущие нули, когда это необходимо.. так что 1 становится 001, 21 становится 021, а 201 остается 201.   -  person Wimpel    schedule 17.08.2020


Ответы (1)


Wimpel предложил

попробуйте: vcfFile = paste("chr",sprintf( "%03d", i),"_file_name.txt", sep="") , отредактируйте: для более короткого кода вы можете использовать paste0() и отбросить sep-аргумент.

для создания имен файлов символов, которые включают 3 цифры и начальные нули, например, 001, 002, ..., 022.

Его можно еще больше сократить, создав имя файла полностью с sprintf(), тем самым удалив вызовы paste() или paste0():

sprintf("chr%03d_file_name.txt", i)

С i <- 1, например, sprintf("chr%03d_file_name.txt", i) возвращает "chr001_file_name.txt".


Есть второе наблюдение:

ОП опубликовал фрагмент кода

for(i in 1:22){SPAGMMATtest = function(
         vcfFile = paste("chr",i,"_file_name.txt", sep=""),
                 vcfFileIndex = "",
         vcfField = "DS",
         savFile = "",
         groupFile ="paste("chr",i,".group_file.txt", sep="")",
         ...

Это выглядит так, как будто OP втянул определение функции в цикл for. Я считаю, что достаточно только вызвать функцию из цикла for:

for (i in 1:22) {
     SPAGMMATtest(
         vcfFile = sprintf("chr%03d_file_name.txt", i),
         vcfFileIndex = "",
         vcfField = "DS",
         savFile = "",
         groupFile = sprintf("chr%03d.group_file.txt", i)
         ...
person Uwe    schedule 20.08.2020
comment
Уважаемый @Uwe, большое спасибо, что нашли время, чтобы улучшить код и полезные объяснения. Благодаря вашим усилиям я многое узнал о полезности sprintf и более эффективном вызове циклов. - person tacrolimus; 20.08.2020