2016-10-30 1 views
0

Ich möchte einen Satz von 100 unabhängigen Array-Dateien zusammenführen, dim = ({x = 684, y = 483, t = 3} (t = Zeit)), in ein großes Array mit dim = (x = 684, y = 483, t = 3, Läufe = 100).Gruppiere einen Satz von Array-Dateien in ein großes Array in R

Ich habe eine ernsthafte (100) Simulation in einer Schleife ausgeführt. Um jede Simulation unterscheidet ich tat:

run.number<-as.integer(runif(1)*10^5) # sets a random number with a small likelihood of repeating itself within the 100 runs 
hP=paste0(run.number,".P_dynamics",”.RData”)# file name 
save(historyP,file=hP) # save array with name = “hP” 

Beispiel einer gespeicherten Dateien: 5468.P_dynamics.RData und 61952.P_dynamics.RData *

Problem: Ich habe 100 unabhängige Array-Dateien oben wie, und ich würde sie in einem Array Gruppe mögen, wie:

dynamics<-array(NA,c(x=684,y=483,t=3,runs=100)) 

wie kann ich das tun? Berücksichtigen Sie, dass die generierte Nummer "run.number" eine große Zufallszahl ist. Außerdem ist die Reihenfolge der Läufe sehr wichtig. Daher muss ältere Datei vor dem neueren Array stehen.

+0

historyP ist das ursprüngliche Array der gespeicherte Dateiname ist: ("eine zufällige Zahl" + ". P_dynamics" + ".RDATA“) – Rui

+0

wenn ich die Daten zu laden, ist der Dateiname‚Pdynamics.RData‘ – Rui

Antwort

1

abind::abind() kombiniert multidimensionale Arrays, ist es einfach. Der schwierige Punkt ist die Vorbereitung der Argumente abind().

(1) Verschieben Sie alle xxx.RData in einen Ordner.

(2) Holen Sie sich die Dateinamen, ändern Sie sie in alt-neue Reihenfolge, und erhalten Sie die Objektnamen von Array.

library(dplyr); library(abind) 

fl <- list.files("FolderName", full = T) 
fl <- fl[order(file.info(fl)$ctime)] 
array_names <- sapply(fl, load) %>% as.vector() 


  • Wenn alle array einen einzigartigen Namen hat;

(3) Last alle xxx.RData, die Liste der Arrays von lapply() machen, und kombinieren es abind::abind(list, rev.along = 0)

for(i in fl) load(i) 
ar <- lapply(array_names, function(x) eval(parse(text = x))) %>% 
    abind(rev.along = 0) 


  • Wenn array s haben einen gemeinsamen Namen (dh length(unique(array_names)) ist 1);

(3) getrennt attach() und in list() setzen

uni_n <- unique(array_names) 
array_list <- list() 

for(i in 1:length(fl)) { 
    attach(fl[i]) 
    array_list[[i]] <- eval(parse(text = uni_n)) 
    detach() 
} 

ar <- abind(array_list, rev.along = 0) 
+0

vielen Dank Es funktioniert perfekt Ich habe auch entwickelt eine ähnliche Art und Weise verwaltet, die auch aber vielen Dank funktioniert – Rui

1

1) erstellen Sie eine Liste mit allen "R.data" Dateien kommen sie bestellt haben, so dass kein Problem

res=list.files('.') 
indexP=grep(pattern="P_dynamics.RData",res) #location of P dynamics files 
resP=res[indexP] #P dynamics files list 

2) Konstruktion P Dynamik globale Array

load(paste0(resP[1])) 
Pdynamics=historyP 
for (i in resP[-1]) 
{ 
    load(i) 
    Pdynamics=abind(Pdynamics,historyP,along=4) 
}