벡터에서 여러 값을 삭제하는 방법은 무엇입니까?
다음과 같은 벡터가 있습니다.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 Infincomparables = 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
'programing' 카테고리의 다른 글
| DataFrame의 각 셀에 기능 적용 (0) | 2023.07.18 |
|---|---|
| SQL Server 20008R2에서 ISDRICT FROM과 ISDRICT FROM을 다시 작성하는 방법은 무엇입니까? (0) | 2023.07.18 |
| zsh: 일치하는 항목을 찾을 수 없음: 요청[보안] (0) | 2023.07.18 |
| scipy.pi, numpy.pi 또는 math.pi를 사용해야 합니까? (0) | 2023.07.18 |
| Oracle 매개 변수를 변환합니다.Int32에 대한 값 (0) | 2023.07.18 |