[r] % in %의 반대

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

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



답변

!연산자를 사용하여 기본적으로 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


답변

어때요?

'%ni%' <- Negate('%in%')
c(1,3,11) %ni% 1:10
# [1] FALSE FALSE  TRUE


답변

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


답변

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

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


답변

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

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

예를 들어 사용법은

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


답변

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

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


답변

다른 해결책은 setdiff

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

D2 = setdiff(D1, D0)

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