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

时间:2016-10-19 12:58:40

标签: r file lapply skip read.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文件总数为&gt;&gt; 100因此我无法手动完成。

1 个答案:

答案 0 :(得分:0)

我可以想到两个选择。

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