【发布时间】:2015-09-24 23:06:41
【问题描述】:
概要
我想找到最快的方法来计算一个子集的多少次
由vec 从逻辑矩阵定义的列是all TRUE:
小例子:
mlgl <- structure(c(FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE,
FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE,
FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE,
TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE,
FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE,
TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE,
FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE), .Dim = c(15L, 5L
), .Dimnames = list(NULL, c("l1", "l2", "l3", "l4", "l5")))
mlgl
#> l1 l2 l3 l4 l5
#> [1,] FALSE FALSE FALSE FALSE FALSE
#> [2,] TRUE FALSE FALSE FALSE TRUE
#> [3,] FALSE TRUE FALSE FALSE FALSE
#> [4,] FALSE FALSE TRUE FALSE FALSE
#> [5,] TRUE TRUE FALSE FALSE TRUE
#> [6,] TRUE FALSE TRUE FALSE TRUE
#> [7,] TRUE FALSE FALSE TRUE TRUE
#> [8,] FALSE TRUE TRUE FALSE FALSE
#> [9,] FALSE TRUE FALSE TRUE FALSE
#> [10,] FALSE FALSE TRUE TRUE FALSE
#> [11,] TRUE TRUE TRUE FALSE TRUE
#> [12,] TRUE TRUE FALSE TRUE TRUE
#> [13,] TRUE FALSE TRUE TRUE TRUE
#> [14,] FALSE TRUE TRUE TRUE FALSE
#> [15,] TRUE TRUE TRUE TRUE TRUE
一个向量子集,由vec定义:
vec <- c("l1", "l3")
我想知道vec 中的所有变量是TRUE 的多少倍。为了
这个 vec 的预期答案是 4(第 6、11、13 和 15 行)。最快的
我能想到的方法是:
sum(rowSums(mlgl[,vec]) == length(vec))
#> [1] 4
compiler::cpmfun 对这些都没有帮助:
microbenchmark(
sum(apply(mlgl[, vec], 1, all)),
sum(rowSums(mlgl[,vec]) == length(vec)),
unit = "eps"
)
#> Unit: evaluations per second
#> expr min lq mean
#> sum(apply(mlgl[, vec], 1, all)) 4416.649 14013.85 13696.17
#> sum(rowSums(mlgl[, vec]) == length(vec)) 27348.557 63477.96 67712.96
#> median uq max neval cld
#> 14210.30 14397.81 14766.03 100 a
#> 65017.46 75503.08 81175.42 100 b
我希望有一些替代解决方案或建议做得更好 这在 R 或 RCpp 中。
更新:添加了一些有助于解决问题的解决方案...不过,再提高一个数量级就好了。
【问题讨论】:
-
所以我之前没用过
unit="eps",是不是越高越好? -
@RichardScriven 每秒更多的评估是“更好”的。如果(就像我在这种情况下一样)您想要多次评估调用(在不同的输入或子集上)。理想情况下,此示例的规模约为 1E6 eps。
-
罗杰。只是想确认一下。
标签: r performance rcpp