2012-06-09 9 views
26

Sto provando a impostare una matrice 3D in R. Immagino sia facile. Tuttavia, non ho trovato una soluzione finora. Diciamo che vogliamo creare una matrice 365x6x4. Anche la forma cruciale per me è come posso cambiare una voce nella matrice. Diciamo che vogliamo assegnare il valore 204 all'elemento [304,5,2]. Apprezzo molto la tua risposta!Impostazione di una matrice 3D in R e accesso a determinati elementi

grazie! meglio, F

+0

3D? Non sarebbe un array 3D? – Havelock

risposta

28

Prova questo:

ar <- array(someData, c(365, 6, 4)); 
ar[304,5,2] <- 204; 

dove someData potrebbe essere

someData <- rep(0, 365*6*4); 

o meglio forse di matrice

someData <- rep(NaN, 365*6*4); 
+1

Notazione sbagliata. ar [304,5,2] è corretto. –

+1

oh, davvero grazie! – Havelock

+0

Nessun problema, devi pensare a C :) –

5

Provate questo semplice esempio (hanno fatto l'esempio abbastanza piccolo in modo che sia chiaro quello che sta succedendo -! spiego qui di seguito come tweak per il vostro precisa domanda) ...

m = array(1:60, dim=c(3,4,5)) 

m[2,1,5] 
[1] 50 

m[2,1,5] = -50 

m[2,1,5] 
[1] -50 

Digita m per vedere l'intero array 3d :)

Nel tuo esempio, avresti impostato l'array iniziale come m = array(NA, dim=c(365,6,4)) (questo lo riempirà con NA per iniziare - hai dati per riempirlo con?) E il compito è m[304,5,2] = 204, ovviamente :)

+0

Per chiarire, 'm [2,1,5]' è inizialmente 50 (a causa del modo in cui 'm' è popolato) e diventa -50 dopo la modifica (' m [2,1,5] = - 50 '). Digita 'm' per vedere l'intero array 3d :) –

13

Una matrice è un caso speciale bidimensionale di un array. (Citando dalla guida per ?matrix).

Quindi, è necessario array:

x <- array(rep(1, 365*5*4), dim=c(365, 5, 4)) 
str(x) 
num [1:365, 1:5, 1:4] 1 1 1 1 1 1 1 1 1 1 ... 

impostare un valore specifico:

x[305, 5, 2] <- 204 

Stampa una fetta:

x[305, , ] 
    [,1] [,2] [,3] [,4] 
[1,] 1 1 1 1 
[2,] 1 1 1 1 
[3,] 1 1 1 1 
[4,] 1 1 1 1 
[5,] 1 204 1 1 
+0

Il primo comando rep è ovviamente ridondante. Vedere la mia risposta per un esempio in cui è possibile vedere l'intero array :) –

+6

@TimP Potrebbe essere ridondante ma è anche estremamente evidente ciò che fa il codice. Affidarsi al comportamento o alla caratteristica * X * di R può distrarre dal vero problema che si sta tentando di illustrare in una risposta. Fare il punto una volta aggiunge al contenuto complessivo di questo Q. Facendolo due volte sembra insignificante. –

+0

Scusa se pensi che sia meschino, anche se Havelock ha sicuramente apprezzato il puntatore - quindi sono contento di averlo menzionato anche a lui :) –