Отрицание% в% в R

Есть ли короткое отрицание %in% в R как !%in% или же %!in%?


Конечно я могу отрицать c("A", "B") %in% c("B", "C") от !(c("A", "B") %in% c("B", "C")) (см. этот вопрос), но я бы предпочел более прямой подход и сохранить пару скобок (вероятно, большинство людей предпочтут c("A", "B") != c("B", "C") над !(c("A", "B") == c("B", "C"))).

4 ответа

Решение

Нет, для этого нет встроенной функции, но вы можете легко написать ее самостоятельно

`%nin%` = Negate(`%in%`)

Или же

`%!in%` = Negate(`%in%`)

Посмотрите эту ветку и последующее обсуждение: % in% operator - NOT IN


Также было указано на посылку Hmisc включает в себя оператора %nin%, так что если вы используете его для своих приложений, он уже там.

library(Hmisc)
"A" %nin% "B"
#[1] TRUE
"A" %nin% "A"
#FALSE

Вы всегда можете создать один:

> `%out%` <- function(a,b) ! a %in% b

> 1:10 %out% 5:15
[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

В противном случае есть несколько похожая функция с setdiff, который возвращает уникальные элементы a которые не в b:

> setdiff(1:10,5:15)
[1] 1 2 3 4
> setdiff(5:15,1:10)
[1] 11 12 13 14 15

На самом деле вам не нужны лишние скобки, !c("A", "B") %in% c("B", "C") работает.

Если вы предпочитаете что-то, что читается легче, просто определите это самостоятельно:

"%nin%" <- function(x, table) match(x, table, nomatch = 0L) == 0L

Преимущество состоит в том, что мы не тратим усилий - мы не получаем результат, а затем отрицаем его, мы просто получаем результат напрямую. (разница обычно должна быть тривиальной)

%!in% функция теперь доступна в library(operators)

Другие вопросы по тегам