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

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

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

问题

我正在寻找类似于 pmaxpmin 但用于布尔操作的函数。

例如:

  1. parallel_and(
  2. c(TRUE, TRUE, TRUE, TRUE),
  3. c(TRUE, TRUE, TRUE, FALSE),
  4. c(TRUE, TRUE, FALSE, TRUE),
  5. c(TRUE, FALSE, TRUE, TRUE)
  6. )

期望的输出是:

  1. # [1] TRUE FALSE FALSE FALSE

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

英文:

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

For example:

  1. parallel_and(
  2. c(TRUE, TRUE, TRUE, TRUE),
  3. c(TRUE, TRUE, TRUE, FALSE),
  4. c(TRUE, TRUE, FALSE, TRUE),
  5. c(TRUE, FALSE, TRUE, TRUE)
  6. )

With an expected output of:

  1. # [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

  1. bools &lt;- list(
  2. c(TRUE, TRUE, TRUE, TRUE),
  3. c(TRUE, TRUE, TRUE, FALSE),
  4. c(TRUE, TRUE, FALSE, TRUE),
  5. c(TRUE, FALSE, TRUE, TRUE)
  6. )
  7. Reduce(`&amp;`, bools)
英文:

You can do

  1. bools &lt;- list(
  2. c(TRUE, TRUE, TRUE, TRUE),
  3. c(TRUE, TRUE, TRUE, FALSE),
  4. c(TRUE, TRUE, FALSE, TRUE),
  5. c(TRUE, FALSE, TRUE, TRUE)
  6. )
  7. Reduce(`&amp;`, bools)

答案2

得分: 4

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

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

这样,当你调用以下代码时:

  1. parallel_and(
  2. c(TRUE, TRUE, TRUE, TRUE),
  3. c(TRUE, TRUE, TRUE, FALSE),
  4. c(TRUE, TRUE, FALSE, TRUE),
  5. c(TRUE, FALSE, TRUE, TRUE)
  6. )

会得到以下结果:

  1. [1] TRUE FALSE FALSE FALSE
英文:

You can use pmin to design your parallel_and function like below

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

such that

  1. parallel_and(
  2. c(TRUE, TRUE, TRUE, TRUE),
  3. c(TRUE, TRUE, TRUE, FALSE),
  4. c(TRUE, TRUE, FALSE, TRUE),
  5. c(TRUE, FALSE, TRUE, TRUE)
  6. )

gives

  1. [1] TRUE FALSE FALSE FALSE

答案3

得分: 2

转换为 data.frame 并使用 rowSums:

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

Convert to data.frame and use rowSums:

  1. d &lt;- data.frame(bools)
  2. rowSums(d) == ncol(d)
  3. # [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

  1. matrixStats::rowProds(bools)

or

  1. 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”吗?

  1. library(parallel)
  2. parallel_and <- function(...){
  3. mcmapply(function(...) all(...), ...)
  4. }
  5. parallel_and(c(TRUE, TRUE, TRUE, TRUE),
  6. c(TRUE, TRUE, TRUE, FALSE),
  7. c(TRUE, TRUE, FALSE, TRUE),
  8. c(TRUE, FALSE, TRUE, TRUE))
  9. #> [1] TRUE FALSE FALSE FALSE

创建于2023-06-15,使用reprex v2.0.2

英文:

Is this what you mean by 'parallel'?

  1. library(parallel)
  2. parallel_and &lt;- function(...){
  3. mcmapply(function(...) all(...), ...)
  4. }
  5. parallel_and(c(TRUE, TRUE, TRUE, TRUE),
  6. c(TRUE, TRUE, TRUE, FALSE),
  7. c(TRUE, TRUE, FALSE, TRUE),
  8. c(TRUE, FALSE, TRUE, TRUE))
  9. #&gt; [1] TRUE FALSE FALSE FALSE

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

答案6

得分: 0

我们可以转置列表,然后循环应用逻辑函数如allany,最后如有必要,unlist

  1. bools <- list(
  2. c(TRUE, TRUE, TRUE, TRUE),
  3. c(TRUE, TRUE, TRUE, FALSE),
  4. c(TRUE, TRUE, FALSE, TRUE),
  5. c(TRUE, FALSE, TRUE, TRUE)
  6. )
  7. bools |> t() |> lapply(all) |> unlist()
  8. [1] TRUE FALSE FALSE FALSE

如果函数的参数必须是多个向量而不是一个列表,我们可以在函数内部将它们列出,然后执行相同的操作:

  1. parallel_and <- function(...) {
  2. list(...) |> t() |> lapply(all) |> unlist()
  3. }
英文:

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

  1. bools &lt;- list(
  2. c(TRUE, TRUE, TRUE, TRUE),
  3. c(TRUE, TRUE, TRUE, FALSE),
  4. c(TRUE, TRUE, FALSE, TRUE),
  5. c(TRUE, FALSE, TRUE, TRUE)
  6. )
  7. bools |&gt; t() |&gt; lapply(all) |&gt; unlist()
  8. [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:

  1. parallel_and &lt;- function(...) {
  2. list(...) |&gt; t() |&gt; lapply(all) |&gt; unlist()
  3. }
  4. </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:

确定