È 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
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. –
@TimKuipers 'pmax' conserva il' dim' dell'oggetto - probabilmente stai tralasciando un passo o il tuo 'x2' non è rettangolare – eddi
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! –