2014-09-12 11 views
5

Sto provando a suddividere una matrice per ottenere sempre una matrice 3 * 3.sottopone a matrice una matrice e ottiene NA se l'indice non è valido

Per esempio, la matrice essendo sottoinsieme è a<-matrix(1:15,3,5), di solito quando ho sottoinsieme utilizzando a[0:2,0:2], ottengo:

 [,1] [,2] 
[1,] 1 4 
[2,] 2 5 

Ma voglio ottenere qualcosa di simile:

 [,1] [,2] [,3] 
[1,] NA NA NA 
[2,] NA 1 4 
[3,] NA 2 5 
+1

Bene, sii equo 'a [rep (1: 3, each = 5), rep (1: 5, each = 3)]' è "subsetting" ma risulta in una matrice più grande. Il vero problema è che a R non piace usare 0 come indici. Confronta: 'x <-1: 5; x [0]; x [6] ' – MrFlick

+0

Un'alternativa è creare' newmat <-matrix (NA, 3,3) 'e quindi riempire tutto o parte di esso con i dati che stai estraendo. –

risposta

4

forza tutti i tuoi 0 's per NA s quando si seleziona, così come qualsiasi 'out-of-bounds valori':

ro <- 0:2 
co <- 0:2 
a[replace(ro,ro == 0 | ro > nrow(a),NA), 
    replace(co,co == 0 | co > ncol(a),NA)] 

#  [,1] [,2] [,3] 
#[1,] NA NA NA 
#[2,] NA 1 4 
#[3,] NA 2 5 

Questo sarà anche lavorare con combinazioni delle parti che si desidera mancanti:

ro <- c(1,0,2) 
co <- 0:2 
a[replace(ro,ro == 0 | ro > nrow(a),NA), 
    replace(co,co == 0 | co > ncol(a),NA)] 

#  [,1] [,2] [,3] 
#[1,] NA 1 4 
#[2,] NA NA NA 
#[3,] NA 2 5 
+2

Forse potresti anche aggiungere 'ro == 0 | ro> nrow (a) '(e anche per le colonne) per coprire qualsiasi errore" subscript out of bounds ". –

+0

Grazie a thelatemail e alexis_laz! Questa è la risposta che sto cercando. – ttliker

1

Si potrebbe creare la propria funzione di riempimento per riempire lo spazio inferiore a 3x3 in base ai valori NA

padmatrix <- function(a, dim=c(3,3)) { 
    stopifnot(all(dim(a)<=dim)) 
    cbind(rep(NA,dim[2]-ncol(a)), rbind(rep(NA,dim[1]-nrow(a)), a)) 
} 

padmatrix(a[1:2, 1:2]) 
#  [,1] [,2] [,3] 
# [1,] NA NA NA 
# [2,] NA 1 4 
# [3,] NA 2 5 
Problemi correlati