programing

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

javajsp 2023. 7. 18. 21:32

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

다음과 같은 벡터가 있습니다.a = c(1:10)다음과 같은 여러 값을 제거해야 합니다.2, 3, 5

벡터에서 해당 숫자(벡터의 위치가 아님)를 삭제하는 방법은 무엇입니까?

벡터를 루프하는 순간 다음과 같은 작업을 수행합니다.

a[!a=NUMBER_TO_REMOVE]

하지만 자동으로 하는 기능이 있다고 생각합니다.

%in%연산자는 제거할 숫자 중 어떤 요소가 있는지 알려줍니다.

> 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비교할 수 없는 내용을 포함할 수 있지만,remove안 할 거야, 우리는 사용할 수 있어요.match돌아오라고 말하는 것0비균등 및 비균등의 경우)%in%의 편리한 바로 가기입니다.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비교할 수 없기 때문에 필요하지 않지만 가독성을 위해 포함하고 싶습니다.
    이건, 뭐야, 뭐야.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벡터 이름을 한 번만 사용하는 ting.그리고 파이프에서 사용할 수 있습니다 :)

먼저 새로운 연산자를 정의할 수 있습니다.

"%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)]

또한 있습니다.subset때때로 유용할 수 있습니다.

a <- sample(1:10)
bad <- c(2, 3, 5)

> subset(a, !(a %in% bad))
[1]  9  7 10  6  8  1  4

업데이트:

위의 모든 답변은 반복되는 값에 대해 작동하지 않습니다. @BenBolker의 답변은 다음을 사용합니다.duplicated()술어는 이것을 해결합니다:

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

이렇게 하면 벡터의 13이 숫자(NAN)가 아니라 거짓 제거(q[c(11,12,13))로 표시됩니다. 이를 시도하면 제거 기능이 벡터 번호에서 작동하지 않음을 알 수 있습니다.전체 벡터를 제거하지만 단일 요소는 제거하지 않을 수 있습니다.

이 기능을 사용해 보십시오.

seq.int.exclude <- function(excluded, ...) {
    x <- seq.int(...)
    return(x[!(x %in% excluded)])
}

통화 예:

seq.int.exclude(from = 10L, to = 20L, excluded = c(12L, 30L, 19L))
seq.int.exclude(from = 10L, to = 20L, excluded = 15L)

언급URL : https://stackoverflow.com/questions/9665984/how-to-delete-multiple-values-from-a-vector