如何首先将R数值矩阵转换为布尔矩阵,然后在该布尔矩阵的列之间应用合取运算符?例如:
> x0.5 0.10.2 0.3> ind <- (x < 0.4)FALSE TRUETRUE TRUE> output <- apply(ind, 2, &)FALSE TRUE
> x
0.5 0.1
0.2 0.3
> ind <- (x < 0.4)
FALSE TRUE
TRUE TRUE
> output <- apply(ind, 2, &)
字符串这里我滥用apply,因为它似乎不这样工作。
apply
drkbr07n1#
y <- x < 0.4#efficient implementationmatrixStats::colProds(y)#[1] 0 1#using applyapply(y, 2, prod)#[1] 0 1#or if & is just an example of a binary operator/function+Reduce(`&`, asplit(y, 1))#[1] 0 1
y <- x < 0.4
#efficient implementation
matrixStats::colProds(y)
#[1] 0 1
#using apply
apply(y, 2, prod)
#or if & is just an example of a binary operator/function
+Reduce(`&`, asplit(y, 1))
字符串
wqsoz72f2#
对几种不同的选择进行基准测试:
library(matrixStats) # `colAlls`, `colProds`, and colMaxslibrary(Rfast) # `colAll` and `colprods`# de-conflict matrixStats::colMaxs and Rfast::colMaxsmsColMaxs <- matrixStats::colMaxsset.seed(732506156)x <- matrix(runif(1e6), 10, 1e5)microbenchmark::microbenchmark( # base functions apply_and = as.logical(apply(x < 0.9, 2, prod)), apply_all = apply(x < 0.9, 2, all), colSum = colSums(x < 0.9) == nrow(x), Reduce = c(Reduce(`&`, asplit(x < 0.9, 1))), # matrixStats colAlls = colAlls(x < 0.9, value = TRUE), colProds = as.logical(colProds(x < 0.9)), msColMaxs = msColMaxs(x) < 0.9, # Rfast colAll = colAll(x < 0.9), #colAll_par = colAll(x < 0.9, parallel = TRUE), # not equivalent--bug!! colMaxs = colMaxs(x, TRUE) < 0.9, colMaxs_par = colMaxs(x, TRUE, TRUE) < 0.9, # check equivalency check = "identical", unit = "relative")
library(matrixStats) # `colAlls`, `colProds`, and colMaxs
library(Rfast) # `colAll` and `colprods`
# de-conflict matrixStats::colMaxs and Rfast::colMaxs
msColMaxs <- matrixStats::colMaxs
set.seed(732506156)
x <- matrix(runif(1e6), 10, 1e5)
microbenchmark::microbenchmark(
# base functions
apply_and = as.logical(apply(x < 0.9, 2, prod)),
apply_all = apply(x < 0.9, 2, all),
colSum = colSums(x < 0.9) == nrow(x),
Reduce = c(Reduce(`&`, asplit(x < 0.9, 1))),
# matrixStats
colAlls = colAlls(x < 0.9, value = TRUE),
colProds = as.logical(colProds(x < 0.9)),
msColMaxs = msColMaxs(x) < 0.9,
# Rfast
colAll = colAll(x < 0.9),
#colAll_par = colAll(x < 0.9, parallel = TRUE), # not equivalent--bug!!
colMaxs = colMaxs(x, TRUE) < 0.9,
colMaxs_par = colMaxs(x, TRUE, TRUE) < 0.9,
# check equivalency
check = "identical",
unit = "relative"
)
字符串结果如下:
#> Unit: relative#> expr min lq mean median uq max neval#> apply_and 146.516660 148.434487 103.863032 120.869415 120.209196 18.2836551 100#> apply_all 126.829494 126.492837 88.907218 102.277152 96.951077 21.3047345 100#> colSum 4.919272 4.923516 4.518798 3.929422 4.616963 5.3557266 100#> Reduce 18.801419 20.290610 18.742439 17.456448 18.347016 11.5879346 100#> colAlls 6.184698 6.122412 5.004275 4.889357 4.816862 4.8643490 100#> colProds 112.836076 118.907810 81.498059 95.937850 91.085323 14.3130057 100#> msColMaxs 5.617544 5.574937 3.968398 4.466546 4.135480 1.1644795 100#> colAll 4.685315 4.555185 4.189683 3.552234 3.351570 5.0080369 100#> colMaxs 3.353147 3.348960 2.280108 2.683182 2.431675 0.8313514 100#> colMaxs_par 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000 100
#> Unit: relative
#> expr min lq mean median uq max neval
#> apply_and 146.516660 148.434487 103.863032 120.869415 120.209196 18.2836551 100
#> apply_all 126.829494 126.492837 88.907218 102.277152 96.951077 21.3047345 100
#> colSum 4.919272 4.923516 4.518798 3.929422 4.616963 5.3557266 100
#> Reduce 18.801419 20.290610 18.742439 17.456448 18.347016 11.5879346 100
#> colAlls 6.184698 6.122412 5.004275 4.889357 4.816862 4.8643490 100
#> colProds 112.836076 118.907810 81.498059 95.937850 91.085323 14.3130057 100
#> msColMaxs 5.617544 5.574937 3.968398 4.466546 4.135480 1.1644795 100
#> colAll 4.685315 4.555185 4.189683 3.552234 3.351570 5.0080369 100
#> colMaxs 3.353147 3.348960 2.280108 2.683182 2.431675 0.8313514 100
#> colMaxs_par 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000 100
型
2条答案
按热度按时间drkbr07n1#
字符串
wqsoz72f2#
对几种不同的选择进行基准测试:
字符串
结果如下:
型