set.seed(1)
N <- 2e4 * 30
dfr <- matrix(rnorm(N), ncol=30)

length(dfr[dfr < -4])

dfr[dfr < -4]

dfr[which(dfr < -4)]

library(microbenchmark)
microbenchmark(bool=dfr[dfr < -2], which=dfr[which(dfr < -2)], times=1e3)


dfr <- data.frame(matrix(1:6, nrow=3))
which(dfr > 4) -> X

----

BENCHMARKS

set.seed(1)
library(microbenchmark)
N <- 2e4 * 30
mat <- matrix(rnorm(N), ncol=30)

microbenchmark(bool=mat[mat < -2], which=mat[which(mat < -2)], times=1e3)
# Unit: milliseconds
#    expr      min       lq   median        uq      max
# 1  bool 7.837418 8.113194 8.242995 10.924428 41.65535
# 2 which 3.498059 3.637434 3.732602  7.366146 40.85562


N <- 100 * 3
mat <- matrix(rnorm(N), ncol=3)

vec <- mat < -4
microbenchmark(bool=mat[vec], which=mat[which(vec)], times=1e3)
# Unit: microseconds
#    expr   min     lq median    uq    max
# 1  bool 3.124 3.4650  3.572 3.694 28.284
# 2 which 2.274 2.5725  2.680 2.810 17.918



N <- 1000 * 3
mat <- matrix(rnorm(N), ncol=3)
vec <- mat < -4
microbenchmark(bool=mat[vec], which=mat[which(vec)], times=1e3)

# Unit: microseconds
#    expr    min     lq median      uq     max
# 1  bool 24.203 24.812 25.134 25.7970 541.457
# 2 which  4.852  5.354  5.542  5.7695 556.943
