2013-02-07 10 views
5

Ho molti molti file .RData contenenti un dataframe che avevo salvato in un'analisi precedente e il frame di dati ha lo stesso nome per ogni file caricato . Quindi per esempio usando load (file1.RData) ottengo un frame di dati chiamato 'df', quindi usando load (file2.RData) ottengo un frame di dati con lo stesso nome 'df'. Mi chiedevo se fosse possibile combinare tutti questi file .RData in un unico grande file .RData dal momento che ho bisogno di caricarli tutti in una volta, con il nome di ogni file df uguale al nome del file in modo da poter quindi utilizzare i diversi cornici di dati.Combinare più file .RData contenenti oggetti con lo stesso nome in un singolo file .RData

Posso farlo usando il codice qui sotto, ma è molto intricato, ci deve essere un modo più semplice per farlo ... Grazie per i vostri suggerimenti.

Dire che ho 3 file .rdata e voglio salvare il tutto in un file chiamato "main.RData" con il loro nome specifico (ora tutti escono come 'df'):

all.files = c("/Users/fra/file1.RData", "/Users/fra/file2.RData", "/Users/fra/file3.RData") 
assign(gsub("/Users/fra/", "", all.files[1]), local(get(load(all.files[1])))) 
rm(list= ls()[!(ls() %in% (ls(pattern = "file")))]) 
save.image(file="main.RData") 


all.files = all.files = c("/Users/fra/file1.RData", "/Users/fra/file2.RData", "/Users/fra/file3.RData") 

for (f in all.files[-1]) { 
    assign(gsub("/Users/fra/", "", f), local(get(load(f)))) 
    rm(list= ls()[!(ls() %in% (ls(pattern = "file")))]) 
    save.image(file="main.RData") 
} 
+0

hai trovato un modo migliore per leggere i diversi file .RData? – user2380782

risposta

3

penso la risposta migliore che ho visto era il codice qui sotto, che ho copiato da una risposta SO che non riesco a rintracciare in questo momento. Scuse all'autore originale.

resave <- function(..., list = character(), file) { 
    previous <- load(file) 
    var.names <- c(list, as.character(substitute(list(...)))[-1L]) 
    for (var in var.names) assign(var, get(var, envir = parent.frame())) 
    save(list = unique(c(previous, var.names)), file = file) 
} 
#I took advantage of the fact the load function 
#returns the name of the loaded variables, so 
#I could use the function's environment instead of creating one. 
#And when using get, I was careful to only look in the 
#environment from which the function is called, i.e. parent.frame() 
+0

Grazie Carl. Immagino che questo funzioni specificando un file .RData salvato in precedenza e aggiungendo a questo file altri oggetti R, ma penso che per applicarlo al mio caso avrei bisogno di applicare questa funzione a ciascuno dei file .RData a turno, ogni volta caricamento di un file .RData, cambiando i nomi degli oggetti in modo da sapere da quale file provengono i frame di dati (tutti i miei file .RData caricano un frame di dati con lo stesso nome esatto) e "accodare" il frame di dati al file .RData salvato. Sto comprendendo questo correttamente? Grazie ancora! – user971102

+0

Ok forse sono quasi lì grazie alla tua funzione (vedi sopra) ... Solo la parte di denominazione non è giusta penso ... Grazie ancora! – user971102

+0

Sembra che tu sia sulla strada giusta. Se per caso i tuoi oggetti dati sono revisioni l'uno dell'altro, cioè un sacco di valori in comune, potresti pensare di memorizzare solo le differenze (una specie di sistemi SVN simili) –

3

Ecco un'opzione che incorpora diversi posti esistenti

all.files = c("file1.RData", "file2.RData", "file3.RData") 

leggere più dataframes in un unico elenco di nome (How can I load an object into a variable name that I specify from an R data file?)

mylist<- lapply(all.files, function(x) { 
    load(file = x) 
    get(ls()[ls()!= "filename"]) 
}) 

names(mylist) <- all.files #Note, the names here don't have to match the filenames 

È possibile salvare la lista, o trasferire il dataframes nell'ambiente globale prima del salvataggio (Unlist a list of dataframes)

list2env(mylist ,.GlobalEnv) 

In alternativa, se i dataframe erano identici e si desidera creare un singolo grande dataframe, è possibile comprimere l'elenco e aggiungere una variabile con i nomi dei file contribuenti (Dataframes in a list; adding a new variable with name of dataframe).

all <- do.call("rbind", mylist) 
all$id <- rep(all.files, sapply(mylist, nrow)) 
Problemi correlati