ケィオスの時系列解析メモランダム

時系列解析,生体情報学,数学・物理などの解説です.

【Rでファイルの一括処理】フォルダ内にある条件に合うファイルの取得

コンピュータを使えば,大量のデータを一括処理できます.つまり,たくさんのデータファイルがあっても,それらを自動で読み込んで,分析できちゃいます.今回は,Rで,たくさんのデータファイルを処理するときのヒントです.

事前知識

 事前の準備として,ファイルの拡張子が表示されるように設定を変更しておいてください.Windowsでの設定方法は以下の記事で説明してあります.
chaos-kiyono.hatenablog.com

 さらに,フォルダへのパスの取得方法を知っているとします.Windowsでのパスの取得法は以下の記事を参考にしてください.
chaos-kiyono.hatenablog.com

Rでフォルダ内にあるファイル名を一括収集

 フォルダの中にあるたくさんのファイルのリストを取得する命令としてlist.files(...)があります.

 調べたいフォルダへのパスを

C:\Document\Example\Folder

とし,このフォルダ内にあるファイルの中でファイル名 (拡張子を含む)に文字列"RRI"が含まれるファイル名のみを集めたいとします.このときは,

DIR <- "C:/Document/Example/Folder"
FN <- list.files(DIR, pattern="RRI")

とすれば,FNにファイル名のリスト (Rのベクトル)が保存されます.パスの指定の部分で,バックスラッシュ\を,スラッシュ/に変えてあることに気づいてください.

 拡張子が"csv"であるファイル名を集めたければ,

FN <- list.files(DIR, pattern="csv$")

とします.

サブフォルダにもファイル探索の手を伸ばす

 指定したフォルダの中にも複数のフォルダがあり,それらのフォルダ (サブフォルダ)の中のファイルも調べたいときがあります.このときは,recursiveオプションを指定します.ファイル名 (拡張子を含む)に文字列"RRI"が含まれるファイル名のみを集めたいときは,

DIR <- "フォルダへのパスを指定"
FN <- list.files(DIR, pattern="RRI",recursive=TRUE, full.names=TRUE)

とします.こうすれば,FNにファイル名のリスト (Rのベクトル)が保存されます.ここでは,full.namesオプションも指定して,ファイルへのパス (フルパス)を取得しています.フォルダの移動を含むRスクリプトの中で,ファイルを読み込むときには,フルパスが分かる必要があるので,私は,サブフォルダへも手を伸ばすときは,full.names=TRUEとします.フルパスというのは,ドライブ名からファイルが含まれる最後のフォルダまで,すべてのフォルダが順番に書いてある形式です.

フルパス付きファイル名をパスとファイル名に分割

 フルパス付きのファイル名を取得したものから,パスとファイル名を分割したいときは,dirname(...),および,basename(...)を使います.

 例えば,FN[1]に,"C:/Document/Example/Folder/RRI_FILE_NAME.csv"が格納されているとき,

dirname(FN[1])

とすれば,パスの部分のみ,つまり,"C:/Document/Example/Folder"がえられます.また,

basename(FN[1])

とすれば,ファイル名の部分のみ,つまり,"RRI_FILE_NAME.csv"がえられます.

ファイル名から拡張子を除く

 拡張子を含むファイル名から,拡張子部分を除いたファイル名をえたければ,

sub('\\.[^.]*', "", basename(FN[1])) 

とします.こうすると,"RRI_FILE_NAME"がえられます.

 あるいは,

strsplit(basename(FN[1]), "\\.")[[1]][1]

としても結果は同じです.

ファイルリストから特定の文字列を含むものを抽出する

 FN <- list.files(...)を使って,複数のファイル名 (ファイルリスト)をFNに格納した状態から,さらに,FN中で,特定の文字列を含むものを選びたいことがあります.これを実現するには,いろんな方法がありますが,ここでは,grep(...)を使った例を紹介します.

 FNに含まれるファイル名のなかで,"12345"が含まれるものを抽出したければ,

grep("12345", FN)

とすれば,FNのうち,何番目のファイル名が条件と一致するかを教えてくれます.ファイル名をえたければ,

FN[grep("12345", FN)]

とします.条件に合うものが複数あっても大丈夫です.

まとめ

 私はデータ分析のスピードを大切にしています.スピードよりも,結果が正しいことが重要なので,この点は忘れないでください.処理スピードを速くするために,コンピュータに自動処理させる部分を増やすということです.たくさんのファイルの自動処理には,今回紹介した方法が役に立つと思います.