【问题标题】:Import multiple csv files into a list and skip files which don't exist将多个 csv 文件导入列表并跳过不存在的文件
【发布时间】:2016-10-19 12:58:40
【问题描述】:

我需要使用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

但我得到了错误:

文件中的错误(文件,“rt”):无法打开连接另外: 警告消息:在文件中(文件,“rt”):无法打开文件 '/Users/I/am/not/that/dumb/26003.csv': 没有这样的文件或目录

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

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

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

【问题讨论】:

  • 也许使用dir(directory) 的结果或与文件名相交的结果:myFilenames &lt;- intersect(dir(directory), filenames)) 应该返回一个包含您的初始 csv 中实际位于目录中的文件名的向量。
  • 你不能Filterfile.exists取出不存在的文件吗?
  • 大家非常感谢,但我在问你 :)
  • lapply(Filter(file.exists, filenames), read.csv, header = FALSE, stringsAsFactors = FALSE)?
  • @Imo 非常感谢。你的建议很好。如果你想发布你的答案,我会接受它是正确的。

标签: r file lapply skip read.csv


【解决方案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"))]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2016-06-23
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    相关资源
    最近更新 更多