2013-05-22 13 views
7
> x <- array(-10:10, dim=c(4,5)) 
> x 
    [,1] [,2] [,3] [,4] [,5] 
[1,] -10 -6 -2 2 6 
[2,] -9 -5 -1 3 7 
[3,] -8 -4 0 4 8 
[4,] -7 -3 1 5 9 

Come si applicano "max (x, 0)" per ogni elemento in modo che ricevo questa matrice:Usa max su ogni elemento di una matrice

 [,1] [,2] [,3] [,4] [,5] 
[1,] 0 0 0 2 6 
[2,] 0 0 0 3 7 
[3,] 0 0 0 4 8 
[4,] 0 0 1 5 9 

risposta

14

Uso pmax:

pmax(x,0) 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 0 0 0 2 6 
#[2,] 0 0 0 3 7 
#[3,] 0 0 0 4 8 
#[4,] 0 0 1 5 9 
+0

Questo non ha funzionato per me. Ho fatto '> x = read.csv (...)> x2 = sapply (data, atanh)> pmax (x2, -20)' ma questo ha prodotto un vettore di '-20' invece di una matrice del dimensioni originali (Si noti che '> class (x2) [1]" matrice "' eventhough '> classe (x) [1]" data.frame "') @Chase la sua soluzione ha funzionato. –

+2

@TimKuipers 'pmax' conserva il' dim' dell'oggetto - probabilmente stai tralasciando un passo o il tuo 'x2' non è rettangolare – eddi

+0

Ah no. L'errore che ho fatto è stato che siccome la mia matrice era veramente grande, ho provato a guardarne solo una parte facendo 'x2 [1:10]' invece di 'x2 [1:10,]'. Mi dispiace! –

5

È possibile utilizzare la funzione di indicizzazione di R [ a farlo direttamente:

x <- array(-10:10, dim=c(4,5)) 
x[x < 0] <- 0 

Questo funziona perché x < 0 crea un'uscita matrice binaria:

x < 0 

    [,1] [,2] [,3] [,4] [,5] 
[1,] TRUE TRUE TRUE FALSE FALSE 
[2,] TRUE TRUE TRUE FALSE FALSE 
[3,] TRUE TRUE FALSE FALSE FALSE 
[4,] TRUE TRUE FALSE FALSE FALSE 

E la matrice risultante è:

 [,1] [,2] [,3] [,4] [,5] 
[1,] 0 0 0 2 6 
[2,] 0 0 0 3 7 
[3,] 0 0 0 4 8 
[4,] 0 0 1 5 9 

La temporizzazione tra i due metodi è sorprendentemente simile. Ecco un esempio più ampio che illustra i tempi comparabili:

xbigC <- xbigE <- matrix(sample(-100:100, 1e8, TRUE), ncol = 1e4) 
system.time(xbigC[xbigC < 0] <- 0) 
#--- 
    user system elapsed 
    4.56 0.37 4.93 
system.time(xbigE <- pmax(xbigE,0)) 
#--- 
    user system elapsed 
    4.10 0.51 4.62 
all.equal(xbigC, xbigE) 
#--- 
[1] TRUE 
+0

grazie per avermi dato queste opzioni – ManInMoon

+0

@ManInMoon - sì, non preoccuparti. L'approccio di indicizzazione diretta sarà più flessibile in quanto è possibile creare condizioni più complicate con altri operatori logici. Per questo compito, sembra che 'pmax()' sia sempre leggermente più efficiente. – Chase

Problemi correlati