답변:
%in%
운영자는 제거 할 numers 사이에있는 요소를 알려줍니다 :
> a <- sample (1 : 10)
> remove <- c (2, 3, 5)
> a
[1] 10 5 2 7 1 6 3 4 8 9
> a %in% remove
[1] FALSE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
> a [! a %in% remove]
[1] 10 7 1 6 4 8 9
이렇게하면 비교할 수없는 항목 ( NA
또는 이와 유사한 항목이 자동으로 제거됨 )에 나열되지 않는 한 Inf)
중복 값이 유지 a
됩니다 remove
.
경우 a
incomparables을 포함 할 수 있지만 remove
하지 않을 것이다, 우리가 사용할 수있는 match
반환을 말하고, 0
비 일치와 incomparables 위해 ( %in%
conventient의 바로 가기입니다 match
) :
> a <- c (a, NA, Inf)
> a
[1] 10 5 2 7 1 6 3 4 8 9 NA Inf
> match (a, remove, nomatch = 0L, incomparables = 0L)
[1] 0 3 1 0 0 0 2 0 0 0 0 0
> a [match (a, remove, nomatch = 0L, incomparables = 0L) == 0L]
[1] 10 7 1 6 4 8 9 NA Inf
incomparables = 0
비교할 수없는 것이 어쨌든 일치 하지 않기 때문에 필요 하지 않지만 가독성을 위해 포함시킬 것입니다.
이것은 btw., setdiff
내부적으로 수행하는 것입니다 (그러나에없는 unique
복제물은 버리지 a
않습니다 remove
).
remove
비교할 수없는 것이 포함 된 경우 개별적으로 확인해야합니다 (예 :
if (any (is.na (remove)))
a <- a [! is.na (a)]
(이것은 구분하지 않습니다 NA
에서 NaN
하지만 R 매뉴얼 어쨌든 그들 사이의 차이를있는에 한 의존하지해야한다는 경고)
위해 Inf
/ -Inf
당신이 모두를 확인해야 sign
하고is.finite
a
하지는 않습니다 remove
. 이것이 문제가되지 않으면을 사용할 수도 있습니다 setdiff
. setdiff
, BTW, 사용 match
에 대한이 %in%
바로 가기입니다.
사용할 수 있습니다 setdiff
.
주어진
a <- sample(1:10)
remove <- c(2, 3, 5)
그때
> a
[1] 10 8 9 1 3 4 6 7 2 5
> setdiff(a, remove)
[1] 10 8 9 1 4 6 7
a
다른 함수의 결과 일 때 매우 유용 하므로 3 대신 임시 변수 대신 한 줄로 작업을 수행 할 수 있습니다
%in%
입력 벡터 (케이스가되는 중복 포함 된 경우 용액 setdiff
만을 단독 반환 세트 중복없이 즉,)
fsetdiff
of data.table
package에는 all
입력 벡터에 중복을 유지할 수 있는 플래그 (기본값 F)가 있습니다.
다음과 같이 할 수 있습니다.
> x<-c(2, 4, 6, 9, 10) # the list
> y<-c(4, 9, 10) # values to be removed
> idx = which(x %in% y ) # Positions of the values of y in x
> idx
[1] 2 4 5
> x = x[-idx] # Remove those values using their position and "-" operator
> x
[1] 2 6
곧
> x = x[ - which(x %in% y)]
which
. @cbeleites 답변과 기본적으로 동일합니다.
which
TRUE 값의 인덱스를 반환합니다. 따라서 빼기 부호를 사용하여 "이 색인 이외의 색인"이라고 말할 수 있습니다. 또한 which
자연어에 더 가깝기 때문에 더 읽기 쉽습니다.
대신에
x <- x[! x %in% c(2,3,5)]
패키지를 사용 purrr
하고 magrittr
, 당신은 할 수 있습니다 :
your_vector %<>% discard(~ .x %in% c(2,3,5))
이 가능 subset
팅 한 번만 벡터 이름을 사용. 그리고 파이프에서 사용할 수 있습니다 :)
최신 정보:
위의 모든 답변은 반복되는 값에 대해 작동하지 않습니다. duplicated()
술어를 사용하는 @BenBolker의 답변은 다음을 해결합니다.
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
원래 답변 : 여기에 약간의 기능을 작성합니다.
exclude_val<-function(full_vector,searched_vector){
found=c()
for(i in full_vector){
if(any(is.element(searched_vector,i))){
searched_vector[(which(searched_vector==i))[1]]=NA
}
else{
found=c(found,i)
}
}
return(found)
}
자, 가정 해 봅시다 full_vector=c(1,2,3,4,1)
하고 searched_vector=c(1,2,3)
.
exclude_val(full_vector,searched_vector)
(4,1)을 반환하지만 위의 답변은을 반환 (4)
합니다.
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
?
full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);
- 1, 1, 2
정답 대신 생성 됩니다 1, 2
.
removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
또한이 subset
유용 때때로 될 수있는 :
a <- sample(1:10)
bad <- c(2, 3, 5)
> subset(a, !(a %in% bad))
[1] 9 7 10 6 8 1 4
setdiff
한 번의 작업으로 모든 작업을 수행하고 수정 된 벡터를 한 번만 참조하므로 더 좋습니다.