Открытие файлов, соответствующих шаблону
У меня есть следующие файлы в моей папке:
Sim_zone_1_TEMP_cell_1_5.ffData
Sim_zone_1_TEMP_cell_1_5.RData
Sim_zone_338_TEMP_cell_338.ffData
Sim_zone_338_TEMP_cell_338.RData
У меня также есть следующий вектор клеток:
cell <- c(1,5,338)
Я хочу открыть файлы, в которых мой номер ячейки совпадает с именем. Например, для ячеек 1 и 5 я хочу иметь:
ffload("Sim_zone_1_TEMP_cell_1_5")
А для клетки 338:
ffload("Sim_zone_338_TEMP_cell_338")
Я попытался с помощью следующего кода:
for (i in 1:length(cell) {
list.files(path = results_wd,
pattern=paste("TEMP_cell_",cell[i],"_",sep=""))
}
Это работает для ячейки № 1, но не для № 5 (потому что у меня есть cell_1_5, а не cell_5). Я не могу использовать только "pattern=paste(" _ ",cell[i]," _ ",sep="")", потому что у меня может быть тот же номер после "zone". Например, это TEMP, но может быть и другое.
На самом деле я хочу две вещи:
- Чтобы выбрать имя файла, где _ ячейка [i] _ появляется везде после "ячейки"
- Как только у меня будет имя, я хочу использовать ffload(Sim_zone_X_TEMP_cell_X_X), поэтому удалите ".ffdata" или ".RData" из имени.
Кто-нибудь может мне помочь?
1 ответ
Сначала я получаю имена файлов (здесь я просто записал их в вектор, но вы можете использовать list.files), затем я удаляю расширение, используя gsub()
затем я перебираю cell
и сопоставьте совпадающие имена файлов соответственно, используя grep()
,
Я добавил несколько дополнительных элементов f.names
(имена тестовых файлов), чтобы удостовериться, что сопоставление не будет неудачным для некоторых обстоятельств, которые, как я думал, вы, вероятно, встретите (например, 338 не должно совпадать с cell_3381).
Основная логика сопоставления состоит в том, чтобы найти число в cell[i]
в имени файла. Число в cell[i]
определяется как совпадающая последовательность числовых символов (например, 338) в имени файла, которому 1) (не сразу) предшествует "ячейка", 2) непосредственно предшествует "_", и 3) за которым не следует никаких чисел
f.names <- c("Sim_zone_1_TEMP_cell_1_5.ffData", "Sim_zone_1_TEMP_cell_1_5.RData", "Sim_zone_338_TEMP_cell_338.ffData", "Sim_zone_338_TEMP_cell_338.RData", "Sim_zone_1_TEMP_5_cell_1.RData", "Sim_zone_338_TEMP_cell_338_1.RData", "Sim_zone_338_TEMP_cell_3381.RData", "Sim_zone_338_TEMP_cell_1338.RData", "Sim_zone_338_TEMP_cell_133811.RData") # example file names
# f.names <- list.files(path=results_wd) # to define f.names based on directory contents, use this line instead
f.names.noExt <- gsub("\\.(?:ff|R)Data$", "", f.names, perl=TRUE) # remove extension from file names
cell <- c(1,5,338) # "cell" values through which to cycle
stored.matches <- list() # this will store matching file names (sans extension), each element of the list will contain a vector of names
for(i in 1:length(cell)){
t.cell <- cell[i] # temporary cell value
t.pattern <- paste("(?<=cell).*_", t.cell, "(?![0-9])", sep="") # temporary pattern based on t.cell
t.matches <- grep(t.pattern, f.names.noExt, perl=TRUE, value=TRUE) # temporary matches
stored.matches[[as.character(t.cell)]] <- t.matches # store the matched names in a list
}
print(stored.matches)