Противоположность% в% - PullRequest
       4

Противоположность% в%

203 голосов
/ 29 апреля 2011

Категориальная переменная V1 в кадре данных D1 может иметь значения, представленные буквами от A до Z. Я хочу создать подмножество D2, которое исключает некоторые значения, скажем, B, N и T. В основном, я хочу команда, противоположная %in%

D2 = subset(D1, V1 %in% c('B','N',T'))

Ответы [ 8 ]

273 голосов
/ 29 апреля 2011

Вы можете использовать оператор !, чтобы фактически сделать любое ИСТИННОЕ ЛОЖЬ и каждое ЛОЖНОЕ ИСТИНА.Итак:

D2 = subset(D1, !(V1 %in% c('B','N','T')))

РЕДАКТИРОВАТЬ: Вы также можете сделать оператор самостоятельно:

'%!in%' <- function(x,y)!('%in%'(x,y))

c(1,3,11)%!in%1:10
[1] FALSE FALSE  TRUE
46 голосов
/ 21 октября 2017

Как насчет:

'%ni%' <- Negate('%in%')
c(1,3,11) %ni% 1:10
# [1] FALSE FALSE  TRUE
28 голосов
/ 29 апреля 2011

Если вы посмотрите на код %in%

 function (x, table) match(x, table, nomatch = 0L) > 0L

, то вы сможете написать свою версию противоположного.Я использую

`%not in%` <- function (x, table) is.na(match(x, table, nomatch=NA_integer_))

Другой способ:

function (x, table) match(x, table, nomatch = 0L) == 0L
12 голосов
/ 17 мая 2018

Вот версия, использующая filter в dplyr, которая применяет ту же технику, что и принятый ответ, отрицая логическое с!:

D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))
9 голосов
/ 21 мая 2018

Использование negate из purrr также делает трюк быстро и аккуратно:

`%not_in%` <- purrr::negate(`%in%`)

Тогда использование, например,

c("cat", "dog") %not_in% c("dog", "mouse")
7 голосов
/ 09 мая 2018

purrr::compose() - это еще один быстрый способ определить это для дальнейшего использования, например:

`%!in%` <- compose(`!`, `%in%`)
2 голосов
/ 06 сентября 2017

Другое решение может использовать setdiff

D1 = c("A",..., "Z") ; D0 = c("B","N","T")

D2 = setdiff(D1, D0)

D2 - желаемое подмножество.

0 голосов
/ 03 марта 2019

Справка по% в%, help("%in%"), в разделе «Примеры» содержит это определение не в,

"%w/o%" <- function(x, y) x[!x %in% y] #-- x without y

Давайте попробуем:

c(2,3,4) %w/o% c(2,8,9)
[1] 3 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...