Отрицание% в% в 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
Преимущество состоит в том, что мы не тратим усилий - мы не получаем результат, а затем отрицаем его, мы просто получаем результат напрямую. (разница обычно должна быть тривиальной)