将多个 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"))]
我需要使用 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"))]