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

Приведенный ниже код работал хорошо, читал файлы в моем каталоге и извлекал значения:

X <- c(75:85) ; Y <- c(208:215) 
extract <- vector()
files <- list.files("C:\\New folder (10)", "*.img",full.names=TRUE)

}

Я пытался указать это с помощью sprintf, но я получил ошибку. Любая помощь, пожалуйста:

for (i in c(1:365)) {
   fileName <- sprintf("C:New folder (10)/Climate_Rad_%d.img", i)
}
 flodel27 мая 2012 г., 23:43
посмотреть на тоprint(files[1]) дает вам и сравнить с тем, что у вас есть в качестве первого аргументаsprintf: "C:New folder (10)/Climate_Rad_%d.img", Могу поспорить, что вам не хватает косой черты.
 Jason Morgan27 мая 2012 г., 23:20
В чем конкретно была ошибка? Попробуйте использоватьpaste построить ваши имена файлов.

Ответы на вопрос(4)

Решение Вопроса

st.files (), а затем отсортировать их. Затем вы извлекаете файлы из отсортированного вектора, который выдает их вам в правильно отсортированном порядке. Это имеет то преимущество, что оно также работает, когда числа отсутствуют в последовательности 1: 365

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

myFiles <- list.files(pattern = "^Climate_Rad_") #all files starting with Climate_
myFiles <- sort(myFiles)
# then read them in, for instance through
for (fileNames in myFiles) {READ.IN.AND.DO.YOUR.MAGIC.ON.THEM}

paste немного упростить ваш код. Пытаться:

# set the working directory
setwd("C:New folder (10)")

# construct a vector of file names and loop through
for (f in paste("Climate_Rad_", 1:365, ".img", sep="")) {
    conne <- file(f, "rb")
    # do rest, assuming it's correct
}
 27 мая 2012 г., 23:53
потому что теперь вы перебираетеbнеi...

gtools пакет имеет функцию & quot;mixedsort& Quot; это может помочь вам

ПримерmyFiles был взят изПитер Вербит ответ.

myFiles <- paste("Climate_Rad_", c(1:15, 95:110), ".img", sep = "") 

install.packages ('gtools')
require ('gtools')

mixedsort (myFiles)

[1] "Climate_Rad_1.img"   "Climate_Rad_2.img"  
[3] "Climate_Rad_3.img"   "Climate_Rad_4.img"  
[5] "Climate_Rad_5.img"   "Climate_Rad_6.img"  
[7] "Climate_Rad_7.img"   "Climate_Rad_8.img"  
[9] "Climate_Rad_9.img"   "Climate_Rad_10.img" 
[11] "Climate_Rad_11.img"  "Climate_Rad_12.img" 
[13] "Climate_Rad_13.img"  "Climate_Rad_14.img" 
[15] "Climate_Rad_15.img"  "Climate_Rad_95.img" 
[17] "Climate_Rad_96.img"  "Climate_Rad_97.img" 
[19] "Climate_Rad_98.img"  "Climate_Rad_99.img" 
[21] "Climate_Rad_100.img" "Climate_Rad_101.img"
[23] "Climate_Rad_102.img" "Climate_Rad_103.img"
[25] "Climate_Rad_104.img" "Climate_Rad_105.img"
[27] "Climate_Rad_106.img" "Climate_Rad_107.img"
[29] "Climate_Rad_108.img" "Climate_Rad_109.img"
[31] "Climate_Rad_110.img"

хорошо, я вижу, проблема в сортировке. Порядок сортировки в алфавитном порядке. Climate_Rad_1 в алфавитном порядке следует Climate_Rad_10, а не Climate_Rad_2 Порядок не является «случайным» вообще, это в алфавитном порядке.

Однако вы хотите, чтобы Climate_Rad_2 обрабатывался до Climate_Rad_10, а не после. Есть несколько способов справиться с этим. Во-первых, вы должны заметить, что Climate_Rad_002 в алфавитном порядке предшествует Climate_Rad_010, поэтому, если вы добавите начальные нули во время создания файлов, это упростит обработку файлов в числовом порядке позже.

В качестве альтернативы, давайте предположим, что вы не смогли добавить нули во время создания файлов. Тогда есть по крайней мере два способа по-прежнему обращаться к файлам по порядку. Либо добавляя нули к именам файлов впоследствии, либо просто сортируйте по числовой части имени файла.

Позвольте мне показать вам последнее.

myFiles <- paste("Climate_Rad_", c(1:15, 95:110), ".img", sep = "") # create some test names, you get the actual myFiles through a call to list.files()

myFiles.sorted <- sort(myFiles) # this gives the alphabetic sorting, not what you want

> myFiles.sorted
 [1] "Climate_Rad_1.img"   "Climate_Rad_10.img"  "Climate_Rad_100.img"
 [4] "Climate_Rad_101.img" "Climate_Rad_102.img" "Climate_Rad_103.img"
 [7] "Climate_Rad_104.img" "Climate_Rad_105.img" "Climate_Rad_106.img"
[10] "Climate_Rad_107.img" "Climate_Rad_108.img" "Climate_Rad_109.img"
[13] "Climate_Rad_11.img"  "Climate_Rad_110.img" "Climate_Rad_12.img" 
[16] "Climate_Rad_13.img"  "Climate_Rad_14.img"  "Climate_Rad_15.img" 
[19] "Climate_Rad_2.img"   "Climate_Rad_3.img"   "Climate_Rad_4.img"  
[22] "Climate_Rad_5.img"   "Climate_Rad_6.img"   "Climate_Rad_7.img"  
[25] "Climate_Rad_8.img"   "Climate_Rad_9.img"   "Climate_Rad_95.img" 
[28] "Climate_Rad_96.img"  "Climate_Rad_97.img"  "Climate_Rad_98.img" 
[31] "Climate_Rad_99.img" 

# split between the part that comes before the numerics and the "1.img" etc.--adjust appropriately
split <- strsplit(myFiles.sorted, "Climate_Rad_") 
# strip the "1.img" etc such that only the numeric part is left
# turn the characters in numeric
split <- as.numeric(sapply(split, function(x) x <- sub(".img", "", x[2])))
# not you can sort, by using order, that gives the original filenames, ordered on the numeric part of the filename
myFiles.correct.order <- myFiles.sorted[order(split)]

 [1] "Climate_Rad_1.img"   "Climate_Rad_2.img"   "Climate_Rad_3.img"  
 [4] "Climate_Rad_4.img"   "Climate_Rad_5.img"   "Climate_Rad_6.img"  
 [7] "Climate_Rad_7.img"   "Climate_Rad_8.img"   "Climate_Rad_9.img"  
[10] "Climate_Rad_10.img"  "Climate_Rad_11.img"  "Climate_Rad_12.img" 
[13] "Climate_Rad_13.img"  "Climate_Rad_14.img"  "Climate_Rad_15.img"   
[16] "Climate_Rad_95.img"  "Climate_Rad_96.img"  "Climate_Rad_97.img" 
[19] "Climate_Rad_98.img"  "Climate_Rad_99.img"  "Climate_Rad_100.img"
[22] "Climate_Rad_101.img" "Climate_Rad_102.img" "Climate_Rad_103.img"
[25] "Climate_Rad_104.img" "Climate_Rad_105.img" "Climate_Rad_106.img"
[28] "Climate_Rad_107.img" "Climate_Rad_108.img" "Climate_Rad_109.img"
[31] "Climate_Rad_110.img"

Это даст вам файлы в том порядке, в котором вы искали. Теперь вытяните файлы в соответствии с этим, например, от

for (fileNames in myFiles.correct.order) {READ.IN.AND.DO.YOUR.THING}

Это должно сделать это. Убедитесь, что вы настроили параметр & quot; Climate_Rad_ & quot; и & quot; .img & quot; в соответствии с вашими именами файлов (вам также может понадобиться добавить путь перед & quot; Climate_Rad_ & quot ;, чтобы сделать его похожим на & quot; C: / filefolder / Climate_Rad_ & quot ;, если это необходимо).

Ваш ответ на вопрос