2016-10-19 4 views
0

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 

しかし、私はエラーました:ファイル26003.csvがソースに含まれていないので、明らかに

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

を。

存在しないファイルをスキップする方法についてのご意見はありますか?

合計でインポートするcsvファイルは>> 100ですので、手動ではできません。

+0

はおそらくの 'dir(ディレクトリ)の結果'やファイル名を持つこのの交点を使用し使用することができます実際にディレクトリにある最初のcsv内のファイル名のベクトルを返す必要があります。 – lmo

+1

'file.exists'で存在しないファイルを' 'フィルタリングすることはできませんか? – Abdou

+0

皆さんありがとうございます。私はあなたにお尋ねします:) –

答えて

0

私は2つのオプションが考えられます。

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

Aに簡単なアプローチは:

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)) 
}) 

ting list-objectには、try-error要素が含まれています。 - 交差(DIR(ディレクトリ)、ファイル名)) `` myFilenames <:あなたがそれらを削除したい場合は、

lst <- lst[sapply(lst, function(x) !inherits(x, "try-error"))] 
関連する問題