Programming

벡터에서 여러 값을 삭제하는 방법은 무엇입니까?

procodes 2020. 7. 26. 13:28
반응형

벡터에서 여러 값을 삭제하는 방법은 무엇입니까?


나는 다음 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)).

  • 경우 aincomparables을 포함 할 수 있지만 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

반응형