2013-06-26 2 views
6

Se ho un array ASottrazione di n, dimensioni k dalla matrice di matrici di n, k dimensioni

A <- array(0, c(4, 3, 5)) 
for(i in 1:5) { 
    set.seed(i) 
    A[, , i] <- matrix(rnorm(12), 4, 3) 
} 

e se devo matrice B

set.seed(6) 
B <- matrix(rnorm(12), 4, 3) 

Il codice di sottrarre B dal ciascuna matrice della matrice a sarebbe:

d<-array(0, c(4,3,5)) 
for(i in 1:5){ 
    d[,,i]<-A[,,i]-B 
} 

Tuttavia, quale sarebbe il codice per eseguire lo stesso calcolo utilizzando una funzione da un" pply "famiglia?

risposta

8

Questo è ciò che è per sweep.

sweep(A, 1:2, B) 
+0

molte grazie per questa informazione –

+0

Ancora un altro comando potente con un nome assolutamente non intuitivo (per i non statistici) ... I love R! Il nome è dissimile da "applicare". – smci

6

Forse non molto intuitivo:

A[] <- apply(A, 3, `-`, B) 
+0

Tnx per una risposta valida. Per favore, dimmi cosa diremo effettivamente a R mentre si tiene la A []? –

+2

Significa assegnare gli elementi di 'A' tra parentesi. Si può ricordare che durante l'indicizzazione, una dimensione mancante significa "selezionare tutti gli elementi in quella dimensione", ad esempio "mat [1,]" significa "selezionare la prima riga e tutte le colonne di matrice' mat' ". Questa convenzione vale anche quando si esegue l'indicizzazione monodimensionale, quindi '[]' significa "seleziona tutti gli elementi". Quello che fa qui è che assegna a 'A' _while mantenendo intatte le sue dimensioni_. Questo è necessario qui perché 'apply' da solo restituirà una struttura bidimensionale, mentre vogliamo un risultato tridimensionale. –

+0

Grande spiegazione, molte grazie :) –

4

Poiché state loop sull'ultima dimensione dell'array, si può semplicemente fare:

d <- A - as.vector(B) 

e sarà molto più veloce. È la stessa idea di quando sottrai un vettore da una matrice: il vettore viene riciclato, quindi viene sottratto a ogni colonna.

+0

+1 questo è un fatto piacevole –

+0

Avevo bisogno di eseguire il ciclo su intere dimensioni della matrice. Forse ho introdotto qualche incomprensione perché nel primo post ho scritto set.seed (5) dando differenze numeriche solo per l'ultima dimensione dell'array. Tuttavia, ho modificato il post (ad es. Set.seed (i)) e probabilmente ho reso ciò che intendo rendere più intuitivo e chiaro. Tuttavia, molte grazie per la risposta! –

+0

@Newbie_R: Non penso che tu capisca che la mia risposta sta dando lo stesso risultato della tua. – flodel