Импортируйте несколько файлов csv в список и пропускайте файлы, которые не существуют

Мне нужно импортировать различные csv файлы из источника в список с помощью lapply.

Дело в том, что файлы csv, которые мне нужны, например, 100, но в источнике их всего 80.

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

Вот мой код:

stations <- read.csv("stations.csv", header = TRUE)
filenames <- paste(stations$ID, "csv", sep = ".") #define the filenames
directory <- "~I/am/not/that/dumb" #set directory where take files to read
filenames <- file.path(directory, filenames) #construct the files paths

list <- lapply(filenames, read.csv, header = FALSE, stringsAsFactors = FALSE) #import the csv into a list

Но я получил ошибку:

Ошибка в файле (файл, "rt"): не удается открыть соединение. Дополнительно: Предупреждение: в файле (файл, "rt"): невозможно открыть файл '/ Users / I / am / not / that / dumb / 26003. csv ': нет такого файла или каталога

очевидно, потому что файл 26003.csv не содержится в исходнике.

Есть предложения, как пропустить несуществующие файлы?

Общее количество импортируемых CSV-файлов >> 100, поэтому я не могу сделать это вручную.


person no_one    schedule 19.10.2016    source источник
comment
Возможно, используйте результаты dir(directory) или пересечение этого с именами файлов: myFilenames <- intersect(dir(directory), filenames)) должен возвращать вектор имен файлов в вашем исходном csv, которые фактически находятся в каталоге.   -  person lmo    schedule 19.10.2016
comment
Вы не можете Filter удалить несуществующие файлы с помощью file.exists?   -  person Abdou    schedule 19.10.2016
comment
ребята большое спасибо но я вас спрашиваю :)   -  person no_one    schedule 19.10.2016
comment
@Imo большое спасибо. ваше предложение работает нормально. Если вы хотите опубликовать свой ответ, я приму его как правильный.   -  person no_one    schedule 19.10.2016
comment
Ответ ниже охватывает как предложенный мной метод, так и хорошую альтернативу.   -  person lmo    schedule 19.10.2016


Ответы (1)


Я могу придумать два варианта.

1) Перед импортом проверьте наличие имен файлов (аналогично комментарию к OP):

stations <- read.csv("stations.csv", header = TRUE)
filenames <- paste(stations$ID, "csv", sep = ".") 
directory <- "~I/am/not/that/dumb" 
filenames <- file.path(directory, filenames)
filenames <- intersect(filenames, list.files(directory, full.names = TRUE)) # added
list <- lapply(filenames, read.csv, header = FALSE, stringsAsFactors = FALSE) 

2) Используйте try / tryCatch для обработки ошибок:

Простой подход:

stations <- read.csv("stations.csv", header = TRUE)
filenames <- paste(stations$ID, "csv", sep = ".") 
directory <- "~I/am/not/that/dumb" 
filenames <- file.path(directory, filenames) 

lst <- lapply(filenames, function(x) {
  try(read.csv(x, header = FALSE, stringsAsFactors = FALSE))
}) 

Результирующий объект-список может тогда содержать try-error элементов. Если вы хотите удалить их, вы можете использовать

lst <- lst[sapply(lst, function(x) !inherits(x, "try-error"))]
person talat    schedule 19.10.2016