我需要使用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因此我无法手动完成。
答案 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"))]