2013-11-22 2 views
0

У меня есть большое количество файлов, каждый из которых имеет формат имени «ARU1_20100706_6_164443000.csv». Часть, которую меня интересует, - это идентификатор частоты «164443000». Некоторые файлы в этой папке имеют одинаковый частотный идентификатор; для каждого идентификатора я хотел бы создать новую папку и поместить все файлы с этим идентификатором в эту папку вместе.Сортировка файлов в папки по имени файла в R

До сих пор у меня было так:

csvfiles <- list.files("C:\\Users\\name\\Documents\\CSV Files\\ARU1", pattern="*.csv", full.names=FALSE) 

csv <- data.frame(csvfiles) 

for (i in 1:length(csv)) { 
    csv$freq <- str_sub(csvfiles, start = 18, end = 25)  
} 

Я полный R новичку и борюсь так заранее спасибо за помощь.

+0

У вас уже есть основные вещи. Используйте «dir.create» для создания каталога (проверьте: http://stackoverflow.com/questions/4216753/check-existence-of-directory-and-create-if-doesnt-exist) и используйте «file.rename», для перемещения файла (Check: http://stackoverflow.com/questions/10266963/moving-files-between-folders) – rags

+1

Предлагаю изменить название вашего вопроса здесь. Это скорее группировка или агрегация, не сортировка. – agstudy

ответ

0

У вас уже есть список файлов csv. Далее я хотел бы извлечь идентификатор-х:

ids = substr(csvfiles, 17, 24) 

в предположении, что файлы CSV всегда иметь точно такую ​​же длину, т.е. идентификатор всегда в том же месте во имя CSV.

Затем вам нужно создать набор каталогов:

no_return_values = sapply(ids, dir.create) 

и скопировать файлы:

no_return_values = mapply(file.copy, csvfiles, ids) 

Я не проверял код, но это основные команды и шаги, которые необходимо брать. Изучите документацию о функциях, которые я использую, чтобы узнать, что они делают.

Вам необходимо прочитать семейство функций *apply как: для каждого элемента в списке выполните эту функцию. Функции *apply не имеют возвращаемых значений, поскольку они используются только для их побочного эффекта, т. Е. Создают каталог и копируют файл.

0
  • Для этой задачи я бы использовал by, так как это задача группировки. You sh
  • file.copy Для копирования файлов. Он векторизован, поэтому нет необходимости использовать цикл
  • использовать file.path для создания путей независимо от используемой ОС.

Что-то вроде этого:

dat <- data.frame(files = csvfiles) 
dat$id <- gsub('.*_(.*)[.]csv','\\1',dat$files) 
by(dat,dat$id,function(x){ 
dir_path <- file.path(getwd(),unique(x$id)) ## replace getwd by any path 
dir.create(dir_path) 
file.copy(dat$files,dir_path) 
}) 
Смежные вопросы