Чтение файлов, соответствующих шаблонам подкаталогов в R - PullRequest
0 голосов
/ 23 сентября 2019

Я использовал много постов, чтобы понять меня (например, здесь Список файлов R с несколькими условиями и здесь Как мне прочитать несколько файлов из нескольких каталогов в R для обработки? но я не могу выполнить то, что мне нужно в R.

У меня есть много файлов .csv, распределенных по нескольким подкаталогам, которые я хочу прочитать, а затем сохранить как отдельные объекты с соответствующим базовым именем.Результатом будет rbind каждого из этих файлов вместе. Вот пример структуры dir и некоторые из того, что я пробовал:

./DATA/Cat_Animal/animal1.csv
./DATA/Dog_Animal/animal2.csv
./DATA/Dog_Animal/animal3.csv
./DATA/Dog_Animal/animal3.1.csv

#read in all csv files
files <- list.files(path="./DATA", pattern="*.csv", full.names=TRUE, recursive=TRUE)

Но это приводит ко всем файлам во всех подкаталогах. Я хочу сопоставить определенные файлы (animalsX.csv) в определенных подкаталогах, соответствующих шаблону (X_Animal), например:

files <- dir(path=paste0("./DATA/", pattern="*+_Animal"), recursive=TRUE, full.names=TRUE, pattern="animal+.*csv")

После того, как я получу свой список файлов, я хочу прочитать каждый из них и сохранить каждый в базовом имени соответствующего файла.Таким образом, файл с именем animal1.csv будет сохранен в animal 1. Я думаю, что мне нужно использовать функцию basename () где-то в цикле, но не уверен, как.

Очень признателен за помощь. Я потратил много времени, пробуя различные варианты с небольшим прогрессом.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

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

myFiles1 <- list.files(path = "./DATA/Cat_Animal/", pattern="animal+.*csv")

processFile <- function(f) {
  df <- read.csv(file = paste0("./DATA/Cat_Animal/", f ))
}
result1 <- sapply(myFiles1, processFile)

#then do it again for the next subdir:
myFiles2 <- list.files(path = "./DATA/Dog_Animal/", pattern="animal+.*csv")

processFile <- function(f) {
  df <- read.csv(file = paste0("./DATA/Dog_Animal/", f ))
}
result2 <- sapply(myFiles2, processFile)

finalDf = do.call(rbind, result1, result2)

Я знаю, что есть лучший способ, но не могу выяснить соответствие шаблонудля подкаталогов!Это так просто в Unix, например

0 голосов
/ 23 сентября 2019

Этот вопрос на самом деле два вопроса, подумайте о том, чтобы разделить их.В последней части вашего вопроса, как связать список, полный data.frames вместе, попробуйте:

finalDf = do.call(rbind, result)

Вам, вероятно, потребуется использовать str_split() из пакета stringr для извлечения частейпути к файлу, который вам нужен.Вы также можете использовать str_extract() регулярные выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...