Чтение нескольких больших файлов в цикле

#r #for-loop

#r #для цикла

Вопрос:

Я пытаюсь прочитать несколько больших файлов в цикле. Поэтому вместо того, чтобы делать:

 library(fst)    
df1 <-read_fst("C:/data1.fst", c(1:2), from = 1, to = 1000)
df2 <-read_fst("C:/data2.fst", c(1:2), from = 1, to = 1000)
df3 <-read_fst("C:/data3.fst", c(1:2), from = 1, to = 1000)
  

Я хотел бы сделать что-то вроде этого:

 for(i in 1:3){
df_i <- read_fst("C:/data_i.fst", c(1:2), from = 1, to = 1000)
}
  

Комментарии:

1. Все ли ваши файлы имеют имена data1, data2 и т. Д.?

Ответ №1:

Вы можете использовать list.files для генерации всех .fst файлов в заданном каталоге, а затем перебирать их:

 files <- list.files(pattern =".fst")  # .fst files in your current directory
df_list <- rep(list(NA), length(files)) # Init list of DFs
for (i in seq_along(files))
  df_list[[i]] <- fst::read_fst(files[i], ...)

  
  • Вы можете уточнить pattern аргумент в list.files соответствии с определенным шаблоном, например pattern = "data_\d .fst" , для сопоставления с data_i.fst
  • Вы также можете указать каталог для просмотра с помощью path аргумента и вернуть полные имена файлов с помощью full.names

Ответ №2:

Для вывода цикла лучше использовать список, подобный этому. Вы можете создать вектор для сохранения каталогов, в которых хранятся файлы (я сделал myvec , и вы можете изменить 1:3 1:n , где n может быть большее число). После этого все результаты цикла будут List включены. Здесь код:

 library(fst)    
#Create empty list
List <- list()
#Vector 
myvec <- paste0("C:/data",1:3,".fst")
#Loop
for(i in 1:length(myvec))
{
  List[[i]] <- read_fst(myvec[i], c(1:2), from = 1, to = 1000)
}