R语言 是否有内置的“并行”函数用于布尔运算?

eaf3rand  于 2023-06-19  发布在  其他
关注(0)|答案(6)|浏览(114)

我正在寻找一个类似于pmaxpmin的函数,但用于布尔运算。
例如:

parallel_and(
  c(TRUE, TRUE, TRUE, TRUE),
  c(TRUE, TRUE, TRUE, FALSE),
  c(TRUE, TRUE, FALSE, TRUE),
  c(TRUE, FALSE, TRUE, TRUE)
)

预期输出为:

# [1]  TRUE FALSE FALSE FALSE

magrittr::and&的别名,因此只接受两个向量(我希望避免在代码中包含额外的依赖项)。

zxlwwiss

zxlwwiss1#

你能做到

bools <- list(
  c(TRUE, TRUE, TRUE, TRUE),
  c(TRUE, TRUE, TRUE, FALSE),
  c(TRUE, TRUE, FALSE, TRUE),
  c(TRUE, FALSE, TRUE, TRUE)
)

Reduce(`&`, bools)
3gtaxfhh

3gtaxfhh2#

您可以使用pmin来设计parallel_and函数,如下所示

parallel_and <- function(...) pmin(...) > 0

使得

parallel_and(
    c(TRUE, TRUE, TRUE, TRUE),
    c(TRUE, TRUE, TRUE, FALSE),
    c(TRUE, TRUE, FALSE, TRUE),
    c(TRUE, FALSE, TRUE, TRUE)
)

给予

[1]  TRUE FALSE FALSE FALSE
n8ghc7c1

n8ghc7c13#

转换为data.frame并使用rowSums:

d <- data.frame(bools)
rowSums(d) == ncol(d)
# [1]  TRUE FALSE FALSE FALSE
jm2pwxwz

jm2pwxwz4#

另一个“左场”的想法:将bools转换为简单数组,然后

matrixStats::rowProds(bools)

matrixStats::colProds(bools)

这将处理您正在执行的AND操作。编辑:一个快速测试显示Stephane的方法运行得更快。

3duebb1j

3duebb1j5#

这就是你所说的“平行”吗?

library(parallel)

parallel_and <- function(...){
  mcmapply(function(...) all(...), ...)
}

parallel_and(c(TRUE, TRUE, TRUE, TRUE),
             c(TRUE, TRUE, TRUE, FALSE),
             c(TRUE, TRUE, FALSE, TRUE),
             c(TRUE, FALSE, TRUE, TRUE))
#> [1]  TRUE FALSE FALSE FALSE

创建于2023-06-15带有reprex v2.0.2

yzckvree

yzckvree6#

我们可以t转换列表,然后循环应用一个逻辑函数,如allany,如果需要,最后再循环应用unlist

bools <- list(
    c(TRUE, TRUE, TRUE, TRUE),
    c(TRUE, TRUE, TRUE, FALSE),
    c(TRUE, TRUE, FALSE, TRUE),
    c(TRUE, FALSE, TRUE, TRUE)
)

bools |> t() |> lapply(all) |> unlist()

[1]  TRUE FALSE FALSE FALSE

如果函数的参数必须是多个向量而不是一个列表,我们可以在函数内部列出它们,然后做同样的事情:

parallel_and <- function(...) {
    list(...) |> t() |> lapply(all) |> unlist()
}

相关问题