2015-06-19 14 views
5

Quindi ho due matrix separati (mat1 e mat2) e ho bisogno di passare attraverso di loro per fare un controllo. Ho bisogno di memorizzare i risultati in una terza matrice.R - Passa attraverso diverse matrici senza usare il loop! Aiuto per un semplice codice

Ritengo che il mio codice sia molto lungo per lo scopo.

Volevo avere alcuni dei vostri suggerimenti per evitare il loop.

Così la mia prima matrice simile a questo (dput alla fine)

wit5.001 wit5.002 wit5.003 wit5.004 wit5.005 wit5.006 wit5.007 wit5.008 wit5.009 wit5.010 
[1,]  1  1  1  1  1  1  1   1  1  1 
[2,]  1  1  1  1  1  1  1  1  1  1 
[3,]  1  1  1  1  1  1  1  1  1  1 
[4,]  1  1  1  1  1  1  1  1  1  1 
[5,]  1  1  1  1  1  1  1  0  1  1 
[6,]  1  1  1  1  1  1  1  0  0  0 
[7,]  0  1  1  1  1  1  1  1  1  1 
[8,]  1  1  1  1  1  1  1  1  1  1 
[9,]  1  1  1  1  1  1  1  1  1  1 
[10,]  1  1  1  1  1  1  1  1  1  1 

mia seconda matrice ha una struttura simile.

Qui creo la mia terza matrice - per archiviare i risultati del controllo.

matCheck <- matrix('ok', ncol = ncol(mat1), nrow = nrow(mat1)) 

Ecco il mio ciclo - che vorrei evitare

for(j in 1:ncol(mat1)){ 
    for(i in 1:nrow(mat1)){ 

    if(mat1[i,j] == 1 & mat2[i,j] == 1) 
    {matCheck[i,j] <- 'ok'} 

    if(mat1[i,j] != 1 & mat2[i,j] == 1) 
    {matCheck[i,j] <- '!'} 

     } 
    } 

Il risultato del controllo

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[2,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[3,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[4,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[5,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[6,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "!" "!" "ok" 
[7,] "!" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[8,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[9,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[10,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 

Qualche suggerimento?

Ecco matrice 1

mat1 = structure(c(1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1), .Dim = c(10L, 
10L), .Dimnames = list(NULL, c("wit5.001", "wit5.002", "wit5.003", 
"wit5.004", "wit5.005", "wit5.006", "wit5.007", "wit5.008", "wit5.009", 
"wit5.010"))) 

Ecco matrice 2

mat2 = structure(c(1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 
1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 
1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 
0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0), .Dim = c(10L, 
10L), .Dimnames = list(NULL, c("wit5.020", "wit5.021", "wit5.022", 
"wit5.023", "wit5.024", "wit5.025", "wit5.026", "wit5.027", "wit5.028", 
"wit5.029"))) 
+0

@Frank - Mi dispiace per colpa mia - hai ragione, non suppongono di essere di dimensioni diverse (ho fatto un errore nel mio sottoinsieme). Ho corretto il codice. – giacomo

+0

Ho intenzione di provare le vostre proposte ragazzi grazie – giacomo

+0

è così semplice! oh no ... Dopo tutto lo sforzo da mettere nei miei loop;) Grazie a @Frank - mettilo come risposta – giacomo

risposta

4

Nell'esempio dato, il risultato può essere costruito come

matCheck <- (mat1 | !mat2) 

Ciò equivale a inizializzare matCheck per vero e poi compilando false dove !mat1 & mat2 (come negli OP ciclo continuo). Le parentesi sono facoltative, ma rendono più facile la lettura (credo).

Problemi correlati