Применить функцию к списку CSV-файлов - PullRequest
1 голос
/ 16 октября 2019

У меня есть 45 CSV-файлов в папке с именем myFolder. Каждый CSV-файл содержит 13 столбцов и 640 строк.

Я хочу прочитать каждый CSV-файл, разделить столбцы 7:12 на 10 и сохранить его в новой папке под названием «Моя папка». Вот мое приближение, которое использует простой цикл for.

library(data.table)
dir.create('newFolder')

allFiles <- list.files(file.path('myFolder'), pattern = '.csv')

for(a in seq_along(allFiles)){

    fileRef <- allFiles[a]
    temp <- fread(file.path('myFolder', fileRef)
    temp[, 7:12] <- temp[, 7:12]/10
    fwrite(temp, file.path('myFolder', paste0('new_',fileRef)))
 }

Существует ли более простое решение в строке или двух, использующее функцию datatable и apply для достижения этой цели?

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Ваш код уже довольно хорош, но эти улучшения могут быть сделаны:

  • заранее определите папки ввода и вывода для модульности
  • используйте full.names = TRUE, чтобы allFilesсодержит полные пути
  • использование .csv$ в качестве шаблона для привязки его к концу имени файла
  • итерация по полным именам вместо индекса
  • использование basenameв fwrite для извлечения базового имени из имени пути

Код тогда

library(data.table)

myFolder <- "myFolder"
newFolder <- "newFolder"

dir.create(newFolder)
allFiles <- list.files(myFolder, pattern = '.csv$', full.names = TRUE)

for(f in allFiles) {
    temp <- fread(f)
    temp[, 7:12] <- temp[, 7:12] / 10
    fwrite(temp, file.path(newFolder, paste0('new_', basename(f))))
}
1 голос
/ 16 октября 2019

Вы можете использовать purrr::walk, если хотите улучшить читабельность своего кода и избавиться от цикла:

allFiles <- list.files(file.path('myFolder'), pattern = '.csv')

purrr::walk(allFiles, function(x){
  temp <- fread(file.path('myFolder', x)
  temp[, 7:12] <- temp[, 7:12]/10
  fwrite(temp, file.path('myFolder', paste0('new_',fileRef)))
})

На странице справки purrr::walk:

walk () возвращает входные данные .x (невидимо)

Хотя я не думаю, что это помогает в скорости.

...