Функция цикла R для выполнения задачи

#r #loops #for-loop

Вопрос:

У меня есть файл, хранящийся в каталоге с именем file1.csv, file2.csv, file3.csv…. file100.csv. Я должен запустить серию скриптов с изменением имени файла с 1,2,3…100. скрипт похож

a1 <- data2haplohh(hap_file="file1.csv", polarize_vcf=FALSE)

с последующим

a_1<-subset(a1, min_maf=0.05)

как мы можем запустить цикл над этими сципитами в R. Я пытаюсь, но получаю ошибки.

Ответ №1:

Способ сделать это в lapply цикле —

 filenames <- list.files(pattern = 'file\d \.csv', full.names = TRUE)

result <- lapply(filenames, function(x) {
  a1 <- data2haplohh(hap_file=x, polarize_vcf=FALSE)
  subset(a1, min_maf==0.05)  
})
 

result должен быть список длиной 100, если у вас 100 файлов.

Комментарии:

1. Спасибо за ответ. Если нам нужно обновить a1 до a2 для файла 2, что будет правильным способом. Я попробовал $i, но не могу прочитать файлы. Наконец, нам нужно записать эти выходные файлы в соответствующем порядке.

2. @DevenderArora Если ваша конечная цель-записать это как новый csv, измените последнюю строку на write.csv(subset(a1, min_maf==0.05), paste0(tools::file_path_sans_ext(basename(x)), '_result.csv'), row.names = FALSE) «вам не нужно создавать объекты , например a1 , a2 в глобальной среде».

Ответ №2:

Мы можем попробовать вот так

 list2env(
    setNames(
        lapply(
            seq(100),
            function(i) {
                subset(
                    data2haplohh(hap_file = sprintf("file%s.csv", i), polarize_vcf = FALSE),
                    min_maf = 0.05
                )
            }
        ), 
        paste0("a_", seq(100))
    ),
    envir = .GlobalEnv
)
 

Комментарии:

1. Спасибо вам за код, он работает гладко. Сейчас я добавляю еще один шаг к коду, но он не распознается. В продолжение a_1 я выполняю еще один шаг для улучшения вывода с помощью a_2 Любая идея, как интегрировать этот шаг в рабочий процесс. Я буду благодарен вам за помощь. Спасибо