You can use the index function R [ for this:
x <- array(-10:10, dim=c(4,5)) x[x < 0] <- 0
This works because x < 0 produces the output of the logical matrix:
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
And the resulting matrix:
[,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
The time between the two methods is surprisingly similar. Here's a larger example illustrating comparable timings:
xbigC <- xbigE <- matrix(sample(-100:100, 1e8, TRUE), ncol = 1e4) system.time(xbigC[xbigC < 0] <- 0)
Chase
source share