Listando todos os arquivos correspondentes a um padrão de caminho completo em R

Eu estou tentando obter a lista de arquivos correspondentes a um padrão de caminho completo . Até agora, usei list.files (), mas não funcionou.

Vamos supor que temos a seguinte organização de diretório:

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

Então o seguinte comando:

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

retornará todos os arquivos correspondentes ao padrão. Isso funciona, mas o problema aparece ao usar um padrão de caminho completo . Por exemplo, se eu quiser obter todos os arquivos CSV dos resultados do diretório / A , eu poderia fazer:

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

Isso não funciona, no entanto. De alguma forma, parece que R não é capaz de usar um padrão de caminho completo como uma expressão regular. Nesse caso, a solução poderia ser apenas usar results / A como o caminho base. Mas em problemas mais complexos, isso não pode ser feito. Por exemplo, em algum momento podemos querer combinar os subdiretórios contendo apenas caracteres:

 list.files(pattern='results/[AZ]+/data-.*\\.csv', recursive=TRUE) 

É possível fazer isso em R?

ATUALIZAÇÃO: Depois de usar soluções ad hoc por um tempo, decidi parar de digitar o mesmo de novo e de novo. Então, criei uma biblioteca para simplificar essa tarefa.

Primeiro, observe que você não está usando padrões de expressão regular. Seu primeiro exemplo deve ser:

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

Então, parece que o padrão correspondente dentro de list.files é aplicado aos list.files dos arquivos (isto é, não incluindo o caminho do diretório) para que você possa dividir a tarefa em:

  1. Encontre todos os arquivos que correspondem apenas ao nome da base e retorne seus caminhos completos:

     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. Mantenha apenas aqueles que correspondem ao (s) diretório (s) esperado (s):

     full.matches <- grep(pattern='^\\./results/A/', basename.matches, value = TRUE) full.matches # [1] "./results/A/data-1.csv" "./results/A/data-2.csv" 

Você não pode fazer isso apenas com list.files porque ele faz um loop sobre cada elemento no path e aplica a expressão regular aos arquivos contidos nele. Mas como o argumento path para list.files pode aceitar um vetor, você pode usá-lo para resolver seu problema.

 dirs <- grep("[AZ]+$",list.dirs("results",recursive=FALSE),value=TRUE) list.files(dirs, "data-.*\\.csv", recursive=TRUE, full.names=TRUE) 

Eu acho que existe uma solução ainda mais simples:

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

usarei

 paths <- list.files(results, pattern= glob2rx("*data-*.csv$*"), full.names=T, recursive=T)