2016-11-27 5 views
0

In einem ersten großen Loop I erzeugt 1.000.000 Matrizen XY_1_1 genannt werden muss, ..., XY_1000_1000:Wie eine bestimmte Zeile einer Matrix zu modifizieren, die durch Paste()

for (i in 1:1000){ 
    for (j in 1:1000){ 
     assign(paste0("XY",i,j ,sep='_'), matrix(ncol=10, nrow=4)) 
    } 
} 

Jetzt möchte ich zuweisen unterschiedliche Ergebnisse einer Funktion (Vektor der Länge 10) in der rth Reihe der Matrizen, die wie die irgendwie sollte:

for (r in 1:4){ 
    for (i in 1000){ 
    for (j in 1:1000){ 
     assign(paste0("XY",i,j ,sep='_')[r,], function(i,j,r)) 
    } 
    } 
} 

Leider haben ich 'incorrect number of dimensions' die Fehler. Außerdem habe ich versucht, die get() -Function mit:

for (r in 1:4){ 
    for (i in 1000){ 
    for (j in 1:1000){ 
     get(paste0("XY",i,j ,sep='_'))[r,] <- function(i,j,r) 
    } 
    } 
} 

die 'target of assignment expands to non-language object' die Fehler gebracht. Kennt jemand eine richtige Lösung? Lassen Sie es mich wissen, falls Sie weitere Informationen benötigen.

+0

von rth Reihe, beabsichtigen Sie die gleiche Zeile in jeder Matrix zu ändern? – Parfait

+0

Ja, das ist richtig! – Julia236

Antwort

2

Sie können alle Objekte in einer Liste speichern, indem Sie lapply verwenden, insbesondere, da sie dieselbe Struktur haben. Mit diesem Ansatz vermeiden Sie, dass Millionen von Matrizen Ihre globale Umgebung überschwemmen und zu Management-Kopfschmerzen werden! Außerdem können Sie problemlos die gleichen Operationen wie die rth-Reihe über alle Matrixelemente hinweg ausführen. Darüber hinaus vermeiden Sie verschachtelte for Schleifen oder assign und get und eval(parse(paste...))). Und dann können Sie immer noch diese Millionen Objekte aus der Liste erhalten, mit list2env:

# LIST OF A MILLION MATRICES (SAME DIMS) 
matlist <- lapply(seq(1000000), function(i) matrix(ncol=10, nrow=4)) 

# NAMING LIST ITEMS 
itemnames <- paste0("XY", c(outer(seq(1000), seq(1000), paste0))) 
matlist <- setNames(matlist, itemnames) 

# UPDATING MATRIX 
matlist <- setNames(lapply(seq(length(matlist)), function(i){   
    mat <- matlist[[i]] 
    for (r in seq(4)) { 
     mat[r,] <- some_function(i,r) 
    } 
    return(mat) 
}), itemnames) 

# OUTPUT INDIVIDUAL ELEMENTS TO SEPARATE GLOBAL OBJECTS 
list2env(matlist, envir=.GlobalEnv) 
+3

Alternativ könnten sie ein vierdimensionales Array oder eine Matrizenmatrix verwenden, wie z. B. m = matrix (list(), 2, 2); m [[1, 1]] <- Matrix (1:20, 4) ' – Frank

+0

Tatsächlich @Frank! OP kann sogar ein Array verwenden: 'a <- Array (NA, dim = c (4,5,4))'. – Parfait

+0

Ich denke, sie brauchen 4 Dimensionen, i, j, r und Spalte ...? – Frank

Verwandte Themen