Tenho uma pasta contendo arquivos .txt com o seguinte nome:
A_COR_001_I
A_COR_001_II
A_COR_002_I
A_COR_002_II
A_COR_003_I
A_COR_003_II
A_COR_003_III
A_COR_004_I
A_COR_004_II
A_COR_004_III
A_COR_004_IV
...
Os algarismos romanos no final de cada string significam o rascunho definitivo de um documento distinto, identificado pelos números arábicos precedentes, como 002. Estou tentando extrair apenas os rascunhos finais com um padrão regex usando uma função list.files(), mas o problema é que cada documento tem um número imprevisível de rascunhos, então eu precisaria de uma maneira de agrupar os rascunhos de cada documento e destacar aqueles com o número mais alto, então A_COR_004_IV em vez de A_COR_004_III ou qualquer outro. Alguma ideia de como proceder? Obrigado antecipadamente!
A base R tem uma
as.roman()
função que permite manipulação simples de... algarismos romanos .Então divida os arquivos em listas por nome de arquivo com base no que aparece antes do último sublinhado (ou seja,
"A_COR_001"
para"A_COR_004"
) e então encontre o elemento com omax()
numeral romano (ou seja, valor numérico máximo após o sublinhado final).Imagino que isso não será um problema aqui, mas observe que os documentos afirmam:
Curiosamente, isso é na verdade apenas
structure(NA_integer_, class = "roman")
.Aliás,
list.files()
retornará os resultados em ordem lexicográfica, que se você tiver no máximo 8 versões de todos os arquivos é a ordem que você quer (atéIX
). Então você pode simplesmente fazerlapply(split(files, sub("_[^_]+$", "", files)), tail, 1)
.Dados
Algo como:
Criado em 2024-10-01 com reprex v2.1.0
Supondo que os nomes dos arquivos não estejam necessariamente em nenhuma ordem específica, defina
stem
como a substring até o último sublinhado ever
como o número da versão convertido em numérico.Em seguida, extraia os nomes de arquivos que tenham a maior versão do seu radical.
Isso usa apenas a base R, é vetorizado e não usa *apply.
Se soubesse que os arquivos já estão classificados, como é o caso da pergunta, então isso seria o suficiente:
Observação