Выполнить для цикла несколько раз в R - PullRequest
0 голосов
/ 05 ноября 2018

У меня около 631 каталога с 20 файлами в каждом каталоге. Я хочу выполнить приведенный ниже код для всех каталогов, чтобы он мог обновлять dir_1 до dir_2 до dir_631 на каждой итерации. Я пробовал удвоить цикл, но я не смог сделать это. Заранее спасибо.

library(TeachingDemos)

txtStart("command_split_1000/dir_1.txt")
files <- list.files(path="data/split_1000/dir_1", pattern="x*", full.names=TRUE)

total.coefs <- data.frame()

for (x in files) {
  message('Running: ', x)

  output <- tryCatch({
    ulfasQTL::findSqtl(x, geneObjectName = "gene_after_preprocess", snpFileCate = 1)
  }, print(x), error=function(e) {
    cat("ERROR :", conditionMessage(e), "\n")
  })

  total.coefs <- rbind(total.coefs, output)
  write.table(total.coefs, file = 'output_split_1000/dir_1', sep='\t')

}

txtStop()

1 Ответ

0 голосов
/ 05 ноября 2018

Рассмотрите возможность размещения цикла list.files внутри цикла list.dirs. Также избегайте использования rbind внутри цикла, так как это приводит к чрезмерному копированию в памяти (см. R Interno Патрика Бернса: Круг 2 - Растущие объекты). Вместо этого используйте lapply для построения списка фреймов данных для rbind вне цикла.

# RETRIEVE ALL NEEDED DIRECORIES
dirs <- list.dirs(path="data/split_1000")

for (d in dirs) {
  txtStart(paste0("command_split_1000/", basename(d), ".txt"))

  # RETRIEVE ALL FILES IN CURRENT DIRECTORY
  message('Directory: ', d)
  files <- list.files(path=d, pattern="x*", full.names=TRUE)

  # LIST OF DATA FRAMES
  df_list <- lapply(files, function(x) {
      message('--Running: ', x)

      output <- tryCatch({
         ulfasQTL::findSqtl(x, geneObjectName = "gene_after_preprocess", snpFileCate = 1)
      }, print(x), error=function(e) {
         cat("ERROR :", conditionMessage(e), "\n")
      })
  })

  # ROW BIND ALL NON-NULL DF ELEMENTS
  df_list <- Filter(NROW, df_list) 
  total.coefs <- do.call(rbind, df_list)

  # SAVE OUTPUT WITH BASE NAME OF CURRENT DIRECTORY
  out_path <- paste0('output_split_1000/', basename(d), '.txt')
  write.table(total.coefs, file = out_path, sep='\t')

  txtStop()

  # RELEASE RESOURCES
  rm(df_list, files, total.coefs)
  gc()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...