是否有内置的“parallel”布尔操作函数?

huangapple go评论71阅读模式
英文:

Are there built-in "parallel" functions for boolean operations?

问题

我正在寻找类似于 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& 的别名,因此只接受两个向量(我想避免在我的代码中添加额外的依赖项)。

英文:

I'm looking for a function similar to pmax and pmin but for boolean operations.

For example:

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

With an expected output of:

# [1]  TRUE FALSE FALSE FALSE

magrittr::and is an alias for <code>&#96;&&#96;</code> so only two vectors are accepted (and I'd like to avoid including an extra dependency in my code).

答案1

得分: 7

bools &lt;- list(
  c(TRUE, TRUE, TRUE, TRUE),
  c(TRUE, TRUE, TRUE, FALSE),
  c(TRUE, TRUE, FALSE, TRUE),
  c(TRUE, FALSE, TRUE, TRUE)
)

Reduce(`&amp;`, bools)
英文:

You can do

bools &lt;- list(
  c(TRUE, TRUE, TRUE, TRUE),
  c(TRUE, TRUE, TRUE, FALSE),
  c(TRUE, TRUE, FALSE, TRUE),
  c(TRUE, FALSE, TRUE, TRUE)
)

Reduce(`&amp;`, bools)

答案2

得分: 4

你可以使用 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
英文:

You can use pmin to design your parallel_and function like below

parallel_and &lt;- function(...) pmin(...) &gt; 0

such that

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

gives

[1]  TRUE FALSE FALSE FALSE

答案3

得分: 2

转换为 data.frame 并使用 rowSums:

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

Convert to data.frame and use rowSums:

d &lt;- data.frame(bools)
rowSums(d) == ncol(d)
# [1]  TRUE FALSE FALSE FALSE

答案4

得分: 2

另一个“不寻常”的想法:将布尔值转换为一个简单的数组,然后使用matrixStats::rowProds(bools)matrixStats::colProds(bools)。这将处理你正在进行的AND操作。编辑:快速测试显示Stephane的方法运行速度要快得多。

英文:

Another 'left-field' idea: convert bools to a simple array, then

matrixStats::rowProds(bools) 

or

matrixStats::colProds(bools)

That will take care of the AND operation you are doing.
EDIT: a quick test shows Stephane's method to run much faster.

答案5

得分: 1

这是您所说的“parallel”吗?

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

英文:

Is this what you mean by 'parallel'?

library(parallel)

parallel_and &lt;- 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))
#&gt; [1]  TRUE FALSE FALSE FALSE

<sup>Created on 2023-06-15 with reprex v2.0.2</sup>

答案6

得分: 0

我们可以转置列表,然后循环应用逻辑函数如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()
}
英文:

We can transpose the list, then loop-apply a logical function like all or any, and finally unlist if necessary.

bools &lt;- list(
    c(TRUE, TRUE, TRUE, TRUE),
    c(TRUE, TRUE, TRUE, FALSE),
    c(TRUE, TRUE, FALSE, TRUE),
    c(TRUE, FALSE, TRUE, TRUE)
)

bools |&gt; t() |&gt; lapply(all) |&gt; unlist()

[1]  TRUE FALSE FALSE FALSE

If the arguments to the function must be multiple vectors instead of a list, we can list them inside the function, then do the same:

parallel_and &lt;- function(...) {
    list(...) |&gt; t() |&gt; lapply(all) |&gt; unlist()
}

</details>



huangapple
  • 本文由 发表于 2023年6月15日 19:38:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/76482089.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定