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, repito el vector y hago algo como:
a[!a=NUMBER_TO_REMOVE]
Pero creo que hay una función que lo hace automáticamente.
setdiff
es mejor, ya que hace todo en una operación y hace referencia al vector modificado solo una vez.a
que no estánremove
también. Si eso no es un problema, también puedes usarlosetdiff
.setdiff
, por cierto, usosmatch
para los cuales%in%
es un atajo.Puedes usar
setdiff
.Dado
Luego
fuente
a
es el resultado de otra función para que pueda hacer cosas en una línea en lugar de 3 y una variable temporal%in%
solución si el vector de entrada contiene duplicados (en cuyo casosetdiff
solo devolverá el conjunto único , es decir, sin duplicados)fsetdiff
deldata.table
paquete tiene unaall
bandera (por defecto F) que permite mantener duplicados en el vector de entrada.Puedes hacerlo de la siguiente manera:
Dentro de poco
fuente
which
aquí. Básicamente es lo mismo que @cbeleites answer.which
devuelve índices de valores VERDADEROS. Por lo tanto, el signo menos se puede usar para decir "los índices que no sean estos índices". Tambiénwhich
es más legible ya que está más cerca del lenguaje natural.en vez de
usando los paquetes
purrr
ymagrittr
puedes hacer:Esto permite
subset
utilizar el nombre del vector solo una vez. Y puedes usarlo en tuberías :)fuente
Primero podemos definir un nuevo operador,
Entonces, es como x no en eliminar
o por qué ir para eliminar, ir directamente
fuente
ACTUALIZAR:
Todas las respuestas anteriores no funcionarán para los valores repetidos, la respuesta de @BenBolker usando un
duplicated()
predicado resuelve esto:Respuesta original: aquí escribo una pequeña función para esto:
entonces, digamos
full_vector=c(1,2,3,4,1)
ysearched_vector=c(1,2,3)
.exclude_val(full_vector,searched_vector)
regresará (4,1), sin embargo, las respuestas anteriores solo devolverán(4)
.fuente
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
?full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);
eso produce en1, 1, 2
lugar de la respuesta correcta1, 2
.removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
Esto establece el 13 en un vector como no un número (NAN), muestra una eliminación falsa (q [c (11,12,13)]) si intenta esto, verá que la función de eliminación no funciona en el número de vector. elimina todo el vector pero quizás no un solo elemento.
fuente
También hay algo
subset
que puede ser útil a veces:fuente