逻辑“和”表示多个逻辑向量

时间:2016-10-20 03:36:48

标签: r logical-operators

如果我有许多逻辑语句(一般是逻辑向量),例如x>1y!=1sin(x)<0,R中是否有函数AND: / p>

AND(x>1, y!=1, sin(x)<0)

给出与

相同的结果
x>1 & y!=1 & sin(x)<0

注意,矢量的数量是可变的,并不限于3。

1 个答案:

答案 0 :(得分:6)

@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使用行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