Existe uma função / loop R que pode adicionar um número ou string exclusivo a um nome de arquivo?

Aug 18 2020

Eu sou novo em R e Stack Overflow. Procurei exaustivamente uma resposta à minha pergunta e não acredito que seja uma pergunta repetida.

Tenho arquivos .csv que são carregados em meu script como quadros de dados e preciso desses quadros salvos como arquivos .Rda ou .RDS.

Da forma como escrevi o código, os arquivos .Rda antigos serão sobrescritos no diretório em que os salvei.

base::save(data, file="data.Rda")

Existe uma maneira de criar um loop que anexa algum número aleatório ou string a um nome de arquivo pré-existente quando ele é salvo, ou mesmo uma função que gera um número de ID exclusivo? O que estou procurando é uma saída que se pareça

data_1.Rda data_2.Rda data_3.Rda e assim por diante, onde _ # é gerado aleatoriamente toda vez que executo o código.

Eu tentei criar um vetor como

x<-c(a, b, c, d, e, f, g, h, i, j, k)

em seguida, criou um loop para salvar através de cada variável individual, mas o loop simplesmente salvou os quadros de dados como "a", "b", "c" ... Eu quero saber se há uma maneira de anexar essas variáveis ​​individuais a um nome pré-existente ("data_a.Rda", "data_b.Rda" ...)

Não sou exigente em relação a nenhum método, desde que funcione.

Respostas

1 AllanCameron Aug 18 2020 at 03:33

Suponha que eu tenha um diretório como este:

/Documents (R home)
     |
     |-- my_data
             |
             |--data_1.Rda
             |--data_2.Rda

Em seguida, posso listar os arquivos no my_datadiretório com:

list.files(path.expand("~/my_data/"))
#> [1] "data_1.Rda"  "data_2.Rda"

E posso gerar o caminho do arquivo "próximo" Rda com uma função simples:

next_rda <- function() {
  f <- list.files(path.expand("~/my_data/"), pattern = "^data_\\d+\\.Rda")
  num <- max(as.numeric(gsub("^data_(\\d)\\.Rda", "\\1", f)) + 1)
  paste0(path.expand("~/my_data/data_"), num, ".Rda")
}

Para que eu possa fazer:

next_rda()
#> [1] "C:/Users/Administrator/Documents/my_data/data_3.Rda"

Isso significa que se eu quiser salvar um objeto, posso fazer:

save(obj, file = next_rda())

Que salvará no próximo arquivo incremental. Como a função verifica o diretório a cada vez, ela sempre grava em um novo arquivo, numerado apropriadamente.

toujames Aug 18 2020 at 03:12

Gostaria de verificar a existência do nome do arquivo. Se existir, crie algum mecanismo de classificação para criar um novo nome de arquivo. Seja uma string gerada aleatoriamente ou um sistema de numeração.

Para sua informação: você pode armazenar várias variáveis ​​em um arquivo rda por:

> save(data1, data2, data3, file = "data.rda")

pseudospin Aug 18 2020 at 03:19

Dê uma olhada em ?tempfile. Ele pode gerar nomes de arquivos exclusivos para você usar.