Есть ли способ перебирать каталоги в одном файле r-script

#r #loops #directory

#r #циклы #каталог

Вопрос:

У меня есть пара сотен папок (наблюдения), в каждой из которых несколько текстовых файлов (каждый из них является пробным). Я смог выяснить, с некоторой помощью, как перебирать текстовые файлы и создавать одно изображение графика, чтобы оно сохранялось в папке / каталоге…

 setwd("~/data/observation1")

library(ggplot2)

files <- list.files(pattern=".txt")
for (i in files){
  mylist <- lapply(setNames(files, files), read.table, header = T)
  mylist <- lapply(names(mylist), function(i) {cbind(mylist[[i]], ID = i)})
  mydata <- do.call(rbind, mylist)
}

ggplot(mydata, aes(x = place, y = firing_rate, colour = ID))   geom_point()   geom_path()
dev.print(pdf, 'observation1.pdf')
  

Это работает отлично, но теперь я пытаюсь, так сказать, уменьшить масштаб, чтобы я мог применить вышеупомянутый код ко всем другим папкам / каталогам (observation2, observation3 и т.д.) Без необходимости проходить и изменять setwd() Один за другим.

Кроме того, было бы также здорово, если бы я мог каким-то образом просто сохранить все графики (по одному для каждой папки) в виде одного большого PDF-файла с несколькими сотнями страниц.

Любые советы о том, как сделать эти две вещи или даже запустить их, очень ценятся, и я с радостью отвечу на любые вопросы.

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

1. Почему вы не хотите использовать setwd() для изменения папок? Вы могли бы сделать это в одном большом for.

2. Вы могли бы рассмотреть purrr пакет, чтобы упростить это. serialmentor.com/blog/2016/6/13 /…

3. Вы можете получить полный путь к файлу, используя аргумент full.names = TRUE в list.files

Ответ №1:

Вот один из подходов, который вы можете изменить в соответствии с вашими потребностями:

 setwd("~/data")

my_folders <- c("observation1", "observation2", "observation3") # etc.

for(j in my_folders) {
  files <- list.files(path = j, pattern=".txt", full.names=T)
  # ... etc
}
  

Ответ №2:

Вы можете создать вектор своих наблюдений с помощью

 vector <- dir(path="~/data/")  # this will list all your observations
mylist<- list()
for ( i in 1:length(vector){
setwd(paste0("~/data/",vector[i]))

files[[i]] <- list.files(pattern=".txt")
for (j in files[[i]]){
  mylist[[i]] <- lapply(setNames(files[[i]], files[[i]]), read.table, header = T)
  mylist[[i]] <- lapply(names(mylist[[i]]), function(j) {cbind(mylist[[i]], ID = j)})
  mydata[[i]] <- do.call(rbind, mylist[[i]])
  }
  }
  

затем вы можете отобразить каждый файл в mylist

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

1. Это выдает мне сообщение «Ошибка в файлах[[i]] <- list.files (pattern = «.txt»): предоставлено больше элементов, чем есть для замены». Я думаю, что проблема заключается в некотором перегибе в двойном вложенном цикле for, но я не могу точно определить, где.