2013-02-07 11 views
5

Mam wiele wielu plików .RData zawierających jedną ramkę danych, którą zapisałem w poprzedniej analizie, a ramka danych ma taką samą nazwę dla każdego załadowanego pliku . Tak więc na przykład używając load (file1.RData) otrzymuję ramkę danych o nazwie 'df', a następnie używając load (file2.RData) otrzymuję ramkę danych o tej samej nazwie 'df'. Zastanawiam się, czy w ogóle można połączyć wszystkie te pliki .RData w jeden duży plik .RData, ponieważ muszę załadować je wszystkie naraz, z nazwą każdego df równą nazwie pliku, aby móc następnie użyć różnych plików ramki danych.Połączyć wiele plików .RData zawierających obiekty o tej samej nazwie w jeden plik .RData

Mogę to zrobić za pomocą poniższego kodu, ale jest to bardzo skomplikowane, musi być prostszy sposób, aby to zrobić ... Dziękuję za sugestie.

Say mam 3 pliki .RData i chcesz zapisać wszystko w pliku o nazwie „main.RData” z ich nazwą (teraz wszyscy wyjdą jako „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

czy otrzymałeś lepszy sposób na odczytanie kilku plików .RData? – user2380782

Odpowiedz

3

myślę najlepszą odpowiedzią, jaką zobaczyłem, był poniższy kod, który skopiowałem z odpowiedzi na WR, której nie mogę teraz znaleźć. Przeprosiny za oryginalnego autora.

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

Dziękuję Carl. Domyślam się, że działa to poprzez określenie jednego początkowego zapisanego pliku .RData i dodanie do tego pliku innych obiektów R, ale myślę, że aby zastosować go do mojego przypadku, musiałbym zastosować tę funkcję do każdego z plików .RData po kolei, za każdym razem ładowanie pliku .RData, zmienianie nazw obiektów, aby wiedzieć, z którego pliku pochodzą ramki danych (wszystkie moje pliki .RData ładują ramkę danych o tej samej dokładnej nazwie) i "dołączanie" ramki danych do zapisany plik .RData. Czy rozumiem to poprawnie? Dzięki jeszcze raz! – user971102

+0

Ok może jestem prawie na miejscu dzięki twojej funkcji (patrz wyżej) ... Tylko część nazw jest nieprawidłowa Myślę, że ... Jeszcze raz dziękuję! – user971102

+0

Brzmi, jakbyś był na dobrej drodze. Jeśli przypadkiem twoje obiekty danych są wzajemnie rewizjami, tj. Wieloma wspólnymi wartościami, możesz pomyśleć o przechowywaniu tylko różnic (coś w rodzaju systemów SVN) –

3

Oto opcja, która łączy kilka istniejących posty

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

Czytaj wielu dataframes na jednej liście nazwie (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 

można zapisać listę, lub przenieść dataframes w środowisku globalnym przed zapisaniem (Unlist a list of dataframes)

list2env(mylist ,.GlobalEnv) 

Alternatywnie, jeśli ramki danych były identyczne i chciałeś utworzyć pojedynczą dużą ramkę danych, możesz zwinąć listę i dodać zmienną z nazwami plików współdziałających (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)) 
Powiązane problemy