Сохранить несколько файлов во многих папках как один файл на папку в R - PullRequest
0 голосов
/ 24 января 2019

Я хочу рекурсивно сканировать все папки в getwd(), выбрать те, которые соответствуют шаблону, добавить имя папки в качестве нового столбца subject и написать по одному .csv для каждой папки.

Пока мне удалось сделать следующее, но это работает только для ручного переключения папок:

library(tidyverse)

dir <- "AP4T/"     
APT4 <-
list.files(path = dir, pattern = "*_PULS.log") %>%
map_df(~read_table2(., skip = 5), .id="file") %>%
select(-CHANNEL, -SIGNAL)

write_csv2(APT4, path = "APT4T/resp.csv") 

Пока этот код работает, мне сложно вручную менять сотни папок, и я верю, что есть способ автоматизировать его, но не могу понять, как.

Например:

dir<-list.dirs(, full.names = T, recursive = T)
for(i in dir){
  list.files(path = dir, pattern = "*_RESP.log", full.names = T) %>%
    map_df(~read_table2(., skip = 5), .id="file") %>%
    select(-CHANNEL, -SIGNAL) %>%
    write_csv(., path = "resp.csv")
}

Создаст один гигантский CSV-файл со ВСЕМИ файлами, соответствующими шаблону - из всех каталогов и без сохранения какого-либо конкретного столбца «имя каталога», чтобы я мог идентифицировать предметы исследования.

Кроме того, поскольку даже один файл огромен, мое программное обеспечение для обработки данных работает лучше на основе одного файла для каждого участника. Вот почему я хотел бы сохранить результат, соответствующий шаблону, в отдельных файлах с дополнительными столбцами для
- номер файла, который помещается в одну папку - Работает, добавив .id="file к ~read_table2() call
- имя папки (папка = тема)

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

1 Ответ

0 голосов
/ 27 января 2019

В конце концов я нашел свой способ сделать это:

library(tidyverse)

# save list of all directories in main/ folder

dir <-list.dirs (path = "main", full.names = T, recursive = T)

#remove 1st item as it points to main directory

dir <- dir[2:73]

# loop over all directories and aggregate files containing "_RESP"

for(i in 1:length(dir))
{
di <- dir[i]

df<-list.files(path = di, pattern = "*_RESP.log", full.names = T) %>%
  map_df(~read_table2(., skip = 5), .id="file")

# Store each merge in separate files with folder as file name

write.csv(df, file = paste0(di,"_RESP",".csv"), row.names = FALSE)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...