Вопрос:
Мои файлы имеют формат:
ada1 ada2 ada3 …. ada10 ada11 ada12
К сожалению, когда я пишу a10, a11 и a12 предшествуют a2. Не могли бы вы помочь мне отсортировать его в алфавитном порядке, как и должно быть?
#
Изменить
Теперь у меня есть тысячи этих файлов. В основном, xyz1-12, abc1-12 и т.д.
Я использую следующее, чтобы получить все файлы:
GG <- grep(«*.txt», list.files(), value = TRUE)
Поэтому я не могу вручную “ada”.
Лучший ответ:
Другой способ использования пакета gtools:
require(gtools) x <- paste0(‘a’, 1:12) mixedsort(x) [1] «a1» «a2» «a3» «a4» «a5» «a6» «a7» «a8» «a9» «a10» «a11» «a12» Ответ №1
Если всегда есть три символа, вы можете сортировать их по этим символам, за ними следует числовая сортировка остальной строки:
GG <- paste0(c(‘ada’, ‘xyz’), 1:20) # Synthesis of data similar to what your command would give
Использование order с несколькими аргументами дает перестановку вектора, а затем индексирование этой перестановкой возвращает данные в желаемом порядке сортировки:
GG[order(substring(GG, 1, 3), as.numeric(substring(GG, 4)))] [1] «ada1» «ada3» «ada5» «ada7» «ada9» «ada11» «ada13» «ada15» «ada17» «ada19» «xyz2» «xyz4» «xyz6» «xyz8» «xyz10» [16] «xyz12» «xyz14» «xyz16» «xyz18» «xyz20» Ответ №2
Если вы не можете изменить свои имена на что-то лучше (то есть ada001, ada002…), вы можете создать двойной индекс. Я предполагаю, что fnames – это вектор с именами файлов, а числам предшествует только фиксированное количество букв.
alpha <- substr(fnames, 1, 3) num <- as.integer(substr(fnames, 4, nchar(fnames))) o <- order(alpha, num) ## that your sorting vector
Вы можете изменить эту процедуру, чтобы разместить различное количество букв, используя регулярные выражения, чтобы найти раскол.
Ответ №3
Если вы можете изменить имена файлов, вы можете сделать что-то вроде следующего:
names0 <- paste0(«a», 1:20) temp <- strsplit(names0, «a») ind <- sapply(temp, «[[«, 2) names1 <- paste0(«a», sprintf(«%03d», as.numeric(ind))) > names1 [1] «a001» «a002» «a003» «a004» «a005» «a006» [7] «a007» «a008» «a009» «a010» «a011» «a012» [13] «a013» «a014» «a015» «a016» «a017» «a018» [19] «a019» «a020»
Возможно, вам придется настроить вызов sprintf на основе этого .
Чтобы уточнить, используя file.rename, было бы довольно просто переименовать все ваши файлы.