2016-10-20 2 views
1

Если у меня есть ряд логических утверждений (логические векторы в целом), как x>1, y!=1 и sin(x)<0, есть функция AND в R:Логические «и» для нескольких логических векторов

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

давая такие же результаты, как

x>1 & y!=1 & sin(x)<0 

Примечание, число векторов являются переменными, а не ограничивается до 3.

+1

Если '' x' и y' одиночные (не векторы), поэтому не все '(х> 1, у ! = 1, sin (x) <0) '? – r2evans

+0

Я думаю, что ваш скалярный случай, безусловно, мощный и гибкий, но слишком много раз я вижу вопросы с недостаточным пониманием '&' versus '&&' в обоих направлениях. Разумеется, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' действительно не является функционально-функциональным. – r2evans

ответ

4

Как отметил @r2evans, если мы будем работать только с скаляр, а не вектор, мы можем использовать all безопасно:

all(1 < 4, 5 > 7, 6 == 6) 

Мой ответ ниже адреса в случае, когда вы работаете с несколькими логическими векторами, и хотели бы принять параллельно/element-wise 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.

Вариант 2а

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 
+0

Ваш пример более общий. Благодарю. – John

Смежные вопросы