Открытие файлов, соответствующих шаблону

У меня есть следующие файлы в моей папке:

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, но может быть и другое.

На самом деле я хочу две вещи:

  1. Чтобы выбрать имя файла, где _ ячейка [i] _ появляется везде после "ячейки"
  2. Как только у меня будет имя, я хочу использовать 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)
Другие вопросы по тегам