英文:
Are there built-in "parallel" functions for boolean operations?
问题
我正在寻找类似于 pmax
和 pmin
但用于布尔操作的函数。
例如:
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>`&`</code> so only two vectors are accepted (and I'd like to avoid including an extra dependency in my code).
答案1
得分: 7
bools <- list(
c(TRUE, TRUE, TRUE, TRUE),
c(TRUE, TRUE, TRUE, FALSE),
c(TRUE, TRUE, FALSE, TRUE),
c(TRUE, FALSE, TRUE, TRUE)
)
Reduce(`&`, bools)
英文:
You can do
bools <- list(
c(TRUE, TRUE, TRUE, TRUE),
c(TRUE, TRUE, TRUE, FALSE),
c(TRUE, TRUE, FALSE, TRUE),
c(TRUE, FALSE, TRUE, TRUE)
)
Reduce(`&`, 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 <- function(...) pmin(...) > 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 <- 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 <- 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
<sup>Created on 2023-06-15 with reprex v2.0.2</sup>
答案6
得分: 0
我们可以转置列表,然后循环应用逻辑函数如all
或any
,最后如有必要,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 t
ranspose the list, then loop-apply a logical function like all
or any
, and finally unlist
if necessary.
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
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 <- function(...) {
list(...) |> t() |> lapply(all) |> unlist()
}
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论