30

フルパスパターンに一致するファイルのリストを取得しようとしています。これまでのところ、 list.files() を使用しましたが、機能しませんでした。

次のディレクトリ構成があるとします。

results
   |- A
   |  |- data-1.csv
   |  |- data-2.csv
   |
   |- B
      |- data-1.csv
      |- data-2.csv

次に、次のコマンドを実行します。

list.files(pattern='data-.*\\.csv', recursive=TRUE)

パターンに一致するすべてのファイルを返します。これは機能しますが、フルパスパターンを使用すると問題が発生します。たとえば、ディレクトリ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でこれを行うことは可能ですか?

更新:アドホック ソリューションをしばらく使用した後、同じことを何度も入力するのをやめることにしました。そこで、この作業を簡素化するためのライブラリを作成しました。

4

4 に答える 4

37

まず、正規表現パターンを使用していないことに注意してください。最初の例は次のとおりです。

list.files(pattern='data-.*\\.csv', recursive=TRUE)

次に、内部のパターンマッチングlist.files がファイルのベース名に適用されているようです(つまり、ディレクトリパスは含まれていません)。そのため、タスクを次のように分割できます。

  1. ベース名のみに一致するすべてのファイルを検索し、それらのフルパスを返します。

    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"
    
  2. 予想されるディレクトリに一致するものだけを保持します。

    full.matches <- grep(pattern='^\\./results/A/', basename.matches, value = TRUE)
    full.matches
    # [1] "./results/A/data-1.csv" "./results/A/data-2.csv"
    
于 2012-04-27T15:56:50.473 に答える
7

list.filesの各要素をループし、pathそこに含まれるファイルに正規表現を適用するという理由だけで、これを行うことはできません。しかし、pathへの引数list.filesはベクトルを受け入れることができるので、それを使用して問題を解決できます。

dirs <- grep("[A-Z]+$",list.dirs("results",recursive=FALSE),value=TRUE)
list.files(dirs, "data-.*\\.csv", recursive=TRUE, full.names=TRUE)
于 2012-04-27T16:08:30.833 に答える
1

もっと簡単な解決策があると思います:

Sys.glob(file.path(results, "[A-Z]", "data-*.csv"))

于 2015-06-17T19:24:31.073 に答える