Я пытаюсь переименовать кучу файлов в r с помощью библиотеки («tidyverse»).
Как есть: Snap-551-Image Export-01_c1_ORG.tif
Жирный раздел представляет собой порядковый номер, начиная с 01 и заканчивая 150, каждое число сочетается с _c1 и _c2.
БУДЕТ: 001_551_c1_AE2315_01.tif
Первые 20 файлов взяты из одного и того же образца. Следовательно, их имена должны иметь один и тот же номер образца, здесь 001, выделенный жирным шрифтом. Исходный номер должен использоваться в конце нового имени файла.
Буду очень признателен за любую помощь в этом вопросе :-) Большое спасибо, Энди.
Пожалуйста, рассмотрите возможность включения вашего существующего кода, это даст некоторое представление о том, как вы планировали подойти к этой проблеме и какие части оказались сложными.
Значит, 001 относится к первым 20 файлам, а следующие 20 должны иметь 002? Если нет, то откуда еще следует взять номер выборки?
Изображения не являются хорошим способом публикации данных (или кода). См. эту мета и соответствующий xkcd. Можете ли вы опубликовать примеры данных в формате dput? Пожалуйста, отредактируйте вопрос, указав код, который вы пробовали, и вывод dput(<filenames table>). Или, если он слишком велик с выходом dput(head(<filenames table>, 20)).
Два дня назад у меня были похожие проблемы, и я использовал file.rename плюс шаблон, как вам уже кто-то сказал. tidyverse не подходит для вашей проблемы.





Возможно, вам подойдет этот простой пример:
# text files in current working directory
A.txt, B.txt, C.txt
# get all files with the unique extension in your cwd
files <- list.files(pattern = "*.txt")
# rename the files by passing a vector of the new file names to the file.rename() function in the order of files in your cwd
file.rename(from = files,
to = c("Apt.txt","Bart.txt","Dart.txt"))
# renamed files in cwd
Apt.txt, Bart.txt, Dart.txt
Однако это очень простой пример того, как переименовывать файлы в cwd, но я надеюсь, что он укажет вам правильное направление.
Это ответ ChatGPT? Это действительно так кажется. И это не решает вопрос: где находится регулярное выражение?
Это НЕ ответ, созданный ChatGPT. Людям следует перестать полагать, что каждый хорошо сформулированный ответ, опубликованный на SO, должен быть сгенерирован ИИ. Люди умны и тоже умеют не торопиться! Кроме того, я считаю, что схема выбора документов ясна из ответа выше.
При этом используются регулярные выражения (регулярные выражения) для создания вектора новых имен на основе исходных имен ваших файлов .tif, а затем используется этот вектор для переименования ваших файлов. Как утверждали другие, этого можно достичь с помощью базы R, но если вам нужно решение tidyverse, вот как это сделать с помощью пакетов dplyr и stringr.
Если вы исключите функцию select(), вы сможете увидеть отдельные шаги, использованные для создания имен файлов, например. столбцы id_num. Три регулярных выражения можно было бы выполнить в одном, но мои навыки не простираются так далеко. Кроме того, использование трех разных шагов, возможно, облегчит выполнение, если вы не знакомы с регулярным выражением.
Он все равно будет работать, даже если у вас есть несколько серийных номеров, например. 551, 552 и т. д.
library(dplyr)
library(stringr)
# Set working directory to where tif files are stored (change to suit)
setwd("C:/folder/where/tif/files/stored")
# Create dataframe with vector of tif file names
file_list <- data.frame(old_name = list.files(pattern = "^Snap.*\\.tif$"))
# Create column with vector of new names (based on your example)
file_list <- file_list |>
mutate(
id_num1 = str_extract(old_name, "(?<=Snap-)[0-9]+"),
id_num2 = str_extract(old_name, "(?<=Image Export-)[0-9]+"),
id_num3 = str_extract(old_name, "(?<=_c)[0-9]+"),
new_name = sprintf("%03d_%s_c%s_AE2315_%02d.tif",
as.integer(id_num2),
id_num1,
id_num3,
as.integer(id_num2))) |>
select(old_name, new_name)
# Rename file_list
file.rename(file_list$old_name, file_list$new_name)
Я не понимаю, зачем вам для этого нужен tidyverse. Я бы использовал
list.files,gsubиfile.rename. Единственная немного сложная часть — создание правильного регулярного выражения.