full-pathパターンに一致するファイルのリストを取得しようとしています。これまでのところ、list.files()を使用しましたが、機能しませんでした。
次のディレクトリ構成があるとします。
results
|- A
| |- data-1.csv
| |- data-2.csv
|
|- B
|- data-1.csv
|- data-2.csv
次に、次のコマンド:
list.files(pattern='data-.*\\.csv', recursive=TRUE)
パターンに一致するすべてのファイルを返します。これは機能しますが、full-pathパターンを使用すると問題が発生します。たとえば、ディレクトリresults/AからすべてのCSVファイルを取得したい場合は、次のようにします。
list.files(pattern='results/A/data-.*\\.csv', recursive=TRUE)
ただし、これは機能しません。どういうわけか、Rはフルパスパターンを正規表現として使用できないようです。この場合の解決策は、ベースパスとしてresults/Aを使用することです。しかし、より複雑な問題では、それは不可能です。たとえば、ある時点で、文字のみを含むサブディレクトリを一致させたい場合があります。
list.files(pattern='results/[A-Z]+/data-.*\\.csv', recursive=TRUE)
Rでこれを行うことは可能ですか?
UPDATE:アドホックソリューションをしばらく使用した後、同じものを何度も入力するのをやめることにしました。そこで、このタスクを簡略化するために library を作成しました。
まず、正規表現パターンを使用していないことに注意してください。最初の例は次のようになります。
list.files(pattern='data-.*\\.csv', recursive=TRUE)
次に、list.files
内のパターンマッチングがファイルのベース名(つまり、ディレクトリパスを含まない)に適用されているように見えるため、タスクを次のように分割できます。
ベース名のみに一致するすべてのファイルを検索し、完全なパスを返します。
basename.matches <- list.files(pattern='data-.*\\.csv', recursive=TRUE,
full.names = TRUE)
basename.matches
# [1] "./results/A/data-1.csv" "./results/A/data-2.csv" "./results/B/data-1.csv"
# [4] "./results/B/data-2.csv"
予想されるディレクトリに一致するもののみを保持します。
full.matches <- grep(pattern='^\\./results/A/', basename.matches, value = TRUE)
full.matches
# [1] "./results/A/data-1.csv" "./results/A/data-2.csv"
path
の各要素をループし、そこに含まれるファイルに正規表現を適用するため、list.files
だけでこれを行うことはできません。ただし、list.files
のpath
引数はベクトルを受け入れることができるので、それを使用して問題を解決できます。
dirs <- grep("[A-Z]+$",list.dirs("results",recursive=FALSE),value=TRUE)
list.files(dirs, "data-.*\\.csv", recursive=TRUE, full.names=TRUE)
もっと簡単な解決策があると思います:
Sys.glob(file.path(results, "[A-Z]", "data-*.csv"))
私が使用します
paths <- list.files(results, pattern= glob2rx("*data-*.csv$*"), full.names=T, recursive=T)