valores - superponer graficas en r
¿Cómo eliminar múltiples valores de un vector? (8)
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
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)]
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)]
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
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 :)
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.
x <- list("a", "b", "c", "d", "e"); # example list
x[-2]; # without 2nd element
x[-c(2, 3, 5)]; # without 2nd,3rd,5th element