2012-03-12 10 views
84

Tengo un vector como: a = c(1:10) y tengo que quitar varios valores, como: 2, 3, 5¿Cómo eliminar múltiples valores de un vector?

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

en el bucle momento en que el vector y hacer algo como:

a[!a=NUMBER_TO_REMOVE] 

pero creo que es una función que lo hace automáticamente.

Respuesta

140

El operador %in% le dice qué elementos se encuentran entre los numers a eliminar los siguientes:

> 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 
16
x <- list("a", "b", "c", "d", "e"); # example list 

x[-2];  # without 2nd element 

x[-c(2, 3, 5)]; # without 2nd,3rd,5th element 
+16

Mencionó específicamente "NO son las posiciones en el vector" – jpd527

+7

Esta respuesta debe eliminarse. No responde la pregunta. –

65

Puede utilizar setdiff.

Dada

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 
+1

muy útil cuando 'a' es el resultado de otra función para que pueda hacer cosas en una línea en lugar de 3 y una variable de temperatura – jf328

+6

Esto producirá resultados diferentes a la solución'% en% 'si el vector de entrada contiene duplicados (en que caso 'setdiff' solo devolverá el _set_ único, es decir, sin duplicados) –

+0

@docendodiscimus:' fsetdiff' del paquete 'data.table' tiene un indicador' all' (F predeterminado) que permite mantener los duplicados en el vector de entrada. – Juergen

5

usted puede 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 

Poco

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

lo que está llamando una lista en su ejemplo es un vector, ¿verdad? – patrick

+0

Sí, me refiero al vector. Gracias por el comentario. – ykpemre

+0

No hay necesidad en 'que' aquí. Básicamente es lo mismo que la respuesta de @cbeleites. –

1

ACTUALIZACIÓN:

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

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

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

exclude_val(full_vector,searched_vector) volverá (4,1), sin embargo las respuestas anteriores devolverán solo (4).

+1

¿qué pasa con 'full_vector [! Full_vector% en% searched_vector | duplicado (full_vector)] '? –

+0

@BenBolker ah No sabía ese predicado "duplicado": ((¿ahora qué, debo eliminar mi respuesta o cambiarla para mostrar solo la tuya en su lugar? –

+1

Puedes editar tu respuesta para incluir mi comentario. –

2

En primer lugar, podemos definir un nuevo operador,

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

Entonces, es como x no quita en

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

o por qué ir para quitar, ir directamente

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

La pregunta dice específicamente que 2, 3 y 5 no son posiciones en el vector. – blakeoft

1

en lugar de

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

utilizando los paquetes purrr y margrittr, que puede hacer:

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

esto permite subconjuntos de usar el nombre del vector solamente una vez. Y se puede usar en tuberías :)

+0

¿puede explicar su última afirmación sobre la longitud del nombre de las variables? ¿Por qué no? ¿Me gusta eso? ¿Por qué es mejor que a la inversa? O bien, elimine ese párrafo ya que no está relacionado con el tema/pregunta principal . – rodrigoap

0
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 que no es un número (NAN) se muestra falsa remove (q [c (11,12,13)]) si intente esto, verá que la función de eliminación no funciona en el número de vector. elimina todo el vector, pero tal vez ni un solo elemento.

+0

Parece que hay mucho trabajo por algo muy simple. –

Cuestiones relacionadas