¿Cómo eliminar múltiples valores de un vector?

Tengo un vector como: a = c(1:10) y necesito eliminar varios valores, como: 2, 3, 5

¿Cómo eliminar esos números ( NO son las posiciones en el vector) en el vector?

en este momento bucle el vector y hago algo como:

 a[!a=NUMBER_TO_REMOVE] 

Pero creo que hay una función que lo hace automáticamente.

El operador %in% te dice qué elementos están entre los numers para eliminar:

 > 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 

Puedes usar setdiff .

Dado

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

Entonces

 > a [1] 10 8 9 1 3 4 6 7 2 5 > setdiff(a, remove) [1] 10 8 9 1 4 6 7 
 x <- list("a", "b", "c", "d", "e"); # example list x[-2]; # without 2nd element x[-c(2, 3, 5)]; # without 2nd,3rd,5th element 

Puedes hacerlo de la siguiente manera:

 > 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 

Dentro de poco

 > x = x[ - which(x %in% y)] 

en lugar de

 x <- x[! x %in% c(2,3,5)] 

usando los paquetes purrr y margrittr , puedes hacer:

 your_vector %<>% discard(~ .x %in% c(2,3,5)) 

esto permite subconjuntos usando el nombre del vector solo una vez. Y puedes usarlo en tuberías 🙂

Primero podemos definir un nuevo operador,

 "%ni%" = Negate( "%in%" ) 

Entonces, es como x no en eliminar

 x <- 1:10 remove <- c(2,3,5) x <- x[ x %ni% remove ] 

o por qué ir para eliminar, ve directamente

 x <- x[ x %ni% c(2,3,5)] 

ACTUALIZAR:

Todas las respuestas anteriores no funcionarán para los valores repetidos, @ la respuesta de BenBolker usando el predicado duplicated() resuelve esto:

 full_vector[!full_vector %in% searched_vector | duplicated(full_vector)] 

Respuesta original: aquí escribo una pequeña función para esto:

 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) } 

entonces, digamos full_vector=c(1,2,3,4,1) y full_vector=c(1,2,3,4,1) searched_vector=c(1,2,3) .

exclude_val(full_vector,searched_vector) devolverá (4,1), sin embargo, las respuestas anteriores devolverán solo (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 

Esto establece el 13 en un vector para que no sea un número (NAN) muestre la eliminación falsa (q [c (11,12,13)]) si prueba esto, verá que la función de eliminación no funciona en el número del vector. eliminas todo el vector, pero tal vez ni un solo elemento.