#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, но я не могу точно определить, где.