多个逻辑向量的逻辑 "and"
Logical "and" for multiple logical vectors
如果我有一些逻辑语句(通常是逻辑向量),比如 x>1
、y!=1
和 sin(x)<0
,R 中是否有函数 AND
:
AND(x>1, y!=1, sin(x)<0)
给出与
相同的结果
x>1 & y!=1 & sin(x)<0
注意,向量的个数是可变的,不限于3个
如@r2evans所述,如果我们只使用标量而不是向量,我们可以安全地使用all
:
all(1 < 4, 5 > 7, 6 == 6)
我下面的回答解决了当您使用多个逻辑向量并希望采用并行/元素方式时的情况 all
。作为一个可重现的例子,假设我们有逻辑向量:
set.seed(0)
a1 <- sample(c(TRUE, FALSE), 5, replace = TRUE)
# [1] FALSE TRUE TRUE FALSE FALSE
a2 <- sample(c(TRUE, FALSE), 5, replace = TRUE)
# [1] TRUE FALSE FALSE FALSE FALSE
a3 <- sample(c(TRUE, FALSE), 5, replace = TRUE)
# [1] TRUE TRUE TRUE FALSE TRUE
我们的目标是不受逻辑向量数量限制的解决方案。
选项 1
我们可以使用Reduce
和"&"
:
## define a function
AND1 <- function (...) Reduce("&", list(...))
AND1(a1, a2, a3)
# [1] FALSE FALSE FALSE FALSE FALSE
二元运算符"&"
只适用于两个输入,所以我们可以
"&"(a1, a2)
但不是
"&"(a1, a2, a3)
Reduce
通过迭代应用 "&"
:
来提供帮助
tmp <- "&"(a1, a2)
"&"(a2, a3)
以下两个选项首先将所有逻辑向量收集到一个矩阵中。然后选项 2a 使用 row-wise all
,而选项 2b 使用 rowSums
.
选项 2a
AND2a <- function (...) {
X <- do.call(cbind, list(...))
base::apply(X, 1L, all)
}
AND2a (a1, a2, a3)
# [1] FALSE FALSE FALSE FALSE FALSE
选项 2b
AND2b <- function (...) {
X <- do.call(cbind, list(...))
## `TRUE` is 1 and `FALSE` is 0 when doing arithmetic sum
## all `TRUE` is as same as row sums equal to `ncol(X)` or `dim(X)[2]`
base::rowSums(X) == dim(X)[2L]
}
AND2b (a1, a2, a3)
# [1] FALSE FALSE FALSE FALSE FALSE
如果我有一些逻辑语句(通常是逻辑向量),比如 x>1
、y!=1
和 sin(x)<0
,R 中是否有函数 AND
:
AND(x>1, y!=1, sin(x)<0)
给出与
相同的结果x>1 & y!=1 & sin(x)<0
注意,向量的个数是可变的,不限于3个
如@r2evans所述,如果我们只使用标量而不是向量,我们可以安全地使用all
:
all(1 < 4, 5 > 7, 6 == 6)
我下面的回答解决了当您使用多个逻辑向量并希望采用并行/元素方式时的情况 all
。作为一个可重现的例子,假设我们有逻辑向量:
set.seed(0)
a1 <- sample(c(TRUE, FALSE), 5, replace = TRUE)
# [1] FALSE TRUE TRUE FALSE FALSE
a2 <- sample(c(TRUE, FALSE), 5, replace = TRUE)
# [1] TRUE FALSE FALSE FALSE FALSE
a3 <- sample(c(TRUE, FALSE), 5, replace = TRUE)
# [1] TRUE TRUE TRUE FALSE TRUE
我们的目标是不受逻辑向量数量限制的解决方案。
选项 1
我们可以使用Reduce
和"&"
:
## define a function
AND1 <- function (...) Reduce("&", list(...))
AND1(a1, a2, a3)
# [1] FALSE FALSE FALSE FALSE FALSE
二元运算符"&"
只适用于两个输入,所以我们可以
"&"(a1, a2)
但不是
"&"(a1, a2, a3)
Reduce
通过迭代应用 "&"
:
tmp <- "&"(a1, a2)
"&"(a2, a3)
以下两个选项首先将所有逻辑向量收集到一个矩阵中。然后选项 2a 使用 row-wise all
,而选项 2b 使用 rowSums
.
选项 2a
AND2a <- function (...) {
X <- do.call(cbind, list(...))
base::apply(X, 1L, all)
}
AND2a (a1, a2, a3)
# [1] FALSE FALSE FALSE FALSE FALSE
选项 2b
AND2b <- function (...) {
X <- do.call(cbind, list(...))
## `TRUE` is 1 and `FALSE` is 0 when doing arithmetic sum
## all `TRUE` is as same as row sums equal to `ncol(X)` or `dim(X)[2]`
base::rowSums(X) == dim(X)[2L]
}
AND2b (a1, a2, a3)
# [1] FALSE FALSE FALSE FALSE FALSE