В R: положить похожие файлы в папку с таким же префиксом - PullRequest
1 голос
/ 18 октября 2019

У меня есть папка с файлами, которые были созданы для подмножества населения. Каждое заполнение содержит 3 разных файла, содержащих данные, каждый из которых начинается с XXX_ для обозначения заполнителя, а затем после "_" указывается тип файла (все сопровождаются .txt). Например: AAA_dat1.txt AAA_dat2.txt AAA_dat3.txt BBB_dat1.txt BBB_dat2.txt BBB_dat3.txt

Я успешно создал новые папки для каждой из групп, извлеченных из моего набора данных (поэтому для этого примера у меня есть папкиААА и ВВВ). Теперь я хочу переместить только AAA_dat1.txt и AAA_dat2.txt в папку AAA, а также BBB_dat1.txt и BBB_dat2.txt в папку BBB, оставив в текущей папке и AAA_dat3.txt, и BBB_dat3.txt. Поскольку у меня будут наборы данных с разным количеством населения, я ищу способ, при котором не нужно каждый раз вручную перемещать файлы для каждого населения. Есть ли такой способ сделать это?

Вот как я смог создать новые папки, в которые я хочу переместить файлы:

newfolders <- c(pops) #pops is the list of populations directly from the dataset

for (j in 1:length(newfolders)){
folder<-dir.create(paste0("~/pathhere/",newfolders[j]))
}

Спасибо.

1 Ответ

1 голос
/ 18 октября 2019

Вот пример:


filenames <- c(
  "AAA_dat1.txt", "AAA_dat2.txt", "AAA_dat3.txt",
  "BBB_dat1.txt", "BBB_dat2.txt", "BBB_dat3.txt"
)

dirs <- gsub("_.*", "", basename(filenames))
dirs
# [1] "AAA" "AAA" "AAA" "BBB" "BBB" "BBB"

Хотя для этого и нет необходимости создавать data.frame, это немного упрощает индексирование и просмотр вещей:

moves <- data.frame(
  origpath = filenames, # not basename'd
  newpath = file.path(dirs, basename(filenames))
)[ !grepl("dat3", basename(filenames)), ]
moves
#       origpath          newpath
# 1 AAA_dat1.txt AAA/AAA_dat1.txt
# 2 AAA_dat2.txt AAA/AAA_dat2.txt
# 4 BBB_dat1.txt BBB/BBB_dat1.txt
# 5 BBB_dat2.txt BBB/BBB_dat2.txt

Обратите внимание, что там нет файлов dat3. Цель этого фрейма - переименовать (переместить) файлы, и поскольку мы не перемещаем их, нам не нужно делать что-либо для них в этом контексте.

Мы можемпереместите их всех одним махом:

file.rename(moves$origpath, moves$newpath)

Кстати: использование basename выше было для обработки ситуации, когда (1) исходные файлы не находятся в текущем каталоге, или(2) вы использовали list.files(..., full.names=TRUE) (чтобы можно было указать полный путь). Это прекрасно работает, когда все они находятся в текущем каталоге или, если нет, например,

filenames <- c(
  "path1/AAA_dat1.txt", "path1/AAA_dat2.txt", "path99/AAA_dat3.txt",
  "path2/BBB_dat1.txt", "path1/BBB_dat2.txt", "somepath/BBB_dat3.txt"
)
dirs  # derived as above
# [1] "AAA" "AAA" "AAA" "BBB" "BBB" "BBB"
moves # derived as above
#             origpath          newpath
# 1 path1/AAA_dat1.txt AAA/AAA_dat1.txt
# 2 path1/AAA_dat2.txt AAA/AAA_dat2.txt
# 4 path2/BBB_dat1.txt BBB/BBB_dat1.txt
# 5 path1/BBB_dat2.txt BBB/BBB_dat2.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...