벡터에서 여러 값을 삭제하는 방법은 무엇입니까?
나는 다음 a = c(1:10)
과 같은 벡터를 가지고 있으며 다음 과 같은 여러 값을 제거해야합니다.2, 3, 5
벡터에서 그 숫자를 삭제하는 방법 ( 벡터의 위치 가 아님 )?
순간에 나는 벡터를 반복하고 다음과 같은 것을한다 :
a[!a=NUMBER_TO_REMOVE]
그러나 자동으로 수행하는 기능이 있다고 생각합니다.
%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
사용할 수 있습니다 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
다음과 같이 할 수 있습니다.
> 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)]
대신에
x <- x[! x %in% c(2,3,5)]
패키지를 사용 purrr
하고 magrittr
, 당신은 할 수 있습니다 :
your_vector %<>% discard(~ .x %in% c(2,3,5))
이 가능 subset
팅 한 번만 벡터 이름을 사용. 그리고 파이프에서 사용할 수 있습니다 :)
먼저 새로운 연산자를 정의 할 수 있습니다.
"%ni%" = Negate( "%in%" )
그런 다음 x는 제거되지 않습니다.
x <- 1:10
remove <- c(2,3,5)
x <- x[ x %ni% remove ]
또는 왜 제거하러 가야합니까?
x <- x[ x %ni% c(2,3,5)]
최신 정보:
위의 모든 답변은 반복되는 값에 대해 작동하지 않습니다. 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)
합니다.
q <- c(1,1,2,2,3,3,3,4,4,5,5,7,7)
rm <- q[11]
remove(rm)
q
q[13] = NaN
q
q %in% 7
This sets the 13 in a vector to not a number(NAN) it shows false remove(q[c(11,12,13)]) if you try this you will see that remove function don't work on vector number. you remove entire vector but maybe not a single element.
There is also subset
which might be useful sometimes:
a <- sample(1:10)
bad <- c(2, 3, 5)
> subset(a, !(a %in% bad))
[1] 9 7 10 6 8 1 4
참고URL : https://stackoverflow.com/questions/9665984/how-to-delete-multiple-values-from-a-vector
'Programming' 카테고리의 다른 글
String.Format과 문자열 연결을 사용하는 것이 더 좋은 경우는 언제입니까? (0) | 2020.07.26 |
---|---|
배열이 비어있는 경우 foreach를 건너 뛰는 가장 깨끗한 방법 (0) | 2020.07.26 |
하스켈 타입 vs 데이터 생성자 (0) | 2020.07.26 |
루비로 추상 클래스를 구현하는 방법은 무엇입니까? (0) | 2020.07.26 |
파이썬에서 객체의 속성을 열거하는 방법은 무엇입니까? (0) | 2020.07.26 |