데이터 프레임 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'))
답변
negate
from 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
원하는 하위 집합입니다.