% in %의 반대


262

데이터 프레임 D1의 categorical 형 변수 V1은 A에서 Z까지의 문자로 표시되는 값을 가질 수 있습니다. B, N 및 T와 같은 일부 값을 제외한 하위 집합 D2를 만들고 싶습니다. 기본적으로 다음과 같은 명령을 원합니다. ~와 반대 인 %in%

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

66
% in %가 아닙니까? ( !(x %in% y)). 인생은 때때로 쉬울 수 있습니다 ...
Joris Meys

답변:


355

!연산자를 사용하여 기본적으로 TRUE FALSE 및 모든 FALSE TRUE를 만들 수 있습니다 . 그래서:

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

5
두 번째 옵션의 사용법은 ?"%in%"새 연산자가 호출 되는 help (match) 페이지 (입력 한 경우 표시 되는 위치)에 설명되어 %w/o%있습니다.
IRTFM

23
또한, 참조 ?Negate"%ni%" <- Negate("%in%")
밥 티스트

2
Negate는 예를 들어 subset(df, variable %ni% c("A", "B")), subset(df, variable Negate("%in%") c("A", "B"))
침례교가

2
@PatrickT는 연산자 만 연산자로 사용할 수 있기 때문입니다. 연산자는 내장되어 있거나로 시작하고 끝납니다 %. 연산자를 만들려면로 시작하고 끝나는 이름에 두 개의 피연산자가있는 함수를 할당해야합니다 %.
날으는 양


31

당신이 코드를 보면 %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

탁월한 솔루션 .. 정기적 인 부정이 실패했을 때 효과가있었습니다.
agatha

17

여기에 사용 버전 filter에서 dplyr그와 논리를 부정하여 허용 대답과 같은 기술을 적용! :

D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))

12

negatefrom purrr을 사용 하면 트릭을 빠르고 깔끔하게 수행합니다.

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

예를 들어 사용법은

c("cat", "dog") %not_in% c("dog", "mouse")

2
Negate같은 기능을하는 내장 기능도 있습니다 . 유일한 차이점은 purrr 호출입니다 as_mapper당신이 동안, 전달하는 일에 Negate전화 match.fun. rdocumentation.org/packages/purrr/versions/0.2.5/topics/… stat.ethz.ch/R-manual/R-devel/library/base/html/match.fun.html
날아 오는 양

7

purrr::compose() 다음과 같이 나중에 사용하기 위해 이것을 정의하는 또 다른 빠른 방법입니다.

`%!in%` <- compose(`!`, `%in%`)

3

다른 해결책은 setdiff

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

D2 = setdiff(D1, D0)

D2 원하는 하위 집합입니다.



0

가장 명확한 사용법은

!('Spain' %in% c('Germany', 'France', 'Italy'))

이것은 이미 여기에 게시 된 답변과 어떻게 다릅니 까?
camille

0
library(roperators)

1 %ni% 2:10

이것이 정답 일 수 있지만 그것이 효과 가 있는지에 대한 추가 설명과 함께 더 유용 할 것 입니다. 자세한 내용을 포함하도록 편집을 고려하고, 10 년 전에 게시 된 승인 된 답변보다 낫다고 생각되는 경우.
Jeremy Caney


-1

% in %에 대한 도움말 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

대안 적으로

"%w/o%" <- function(x, y) !x %in% y #--  x without y
c(2,3,4) %w/o% c(2,8,9)
# [1] FALSE  TRUE  TRUE
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.