将多个 csv 文件导入列表并跳过不存在的文件

Import multiple csv files into a list and skip files which don't exist

我需要使用 lapply 将来源中的不同 csv 文件导入到列表中。

关键是我想要的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

但是我得到了错误:

Error in file(file, "rt") : cannot open the connection In addition: Warning message: In file(file, "rt") : cannot open file '/Users/I/am/not/that/dumb/26003.csv': No such file or directory

显然是因为文件 26003.csv 未包含在源文件中。

关于如何跳过不存在的文件有什么建议吗?

总共要导入的 csv 文件有 >> 100 个,因此我无法手动导入。

我可以想到两个选项。

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"))]