Eu tenho um vetor como: a = c(1:10)
e preciso remover vários valores, como:2, 3, 5
Como excluir esses números (eles NÃO são as posições do vetor) no vetor?
No momento, faço um loop no vetor e faço algo como:
a[!a=NUMBER_TO_REMOVE]
Mas acho que existe uma função que faz isso automaticamente.
setdiff
é melhor, pois faz tudo em uma operação e faz referência ao vetor alterado apenas uma vez.a
que não estãoremove
também. Se isso não for um problema, você também pode usarsetdiff
.setdiff
, btw, usamatch
para o qual%in%
é um atalho.Você pode usar
setdiff
.Dado
Então
fonte
a
é o resultado de outra função que você pode fazer coisas em uma linha, em vez de 3 e uma variável temporário%in%
solução se o vector de entrada contém duplicados (caso em quesetdiff
só irá devolver o único conjunto , isto é, sem as repetições)fsetdiff
ofdata.table
package possui umaall
flag (padrão F) que permite manter duplicatas no vetor de entrada.Você pode fazer o seguinte:
Em breve
fonte
which
aqui. É basicamente o mesmo que a resposta @cbeleites.which
retorna índices de valores TRUE. Portanto, o sinal de menos pode ser usado para dizer "os índices diferentes desses índices". Tambémwhich
é mais legível, pois está mais próximo da linguagem natural.ao invés de
usando os pacotes
purrr
emagrittr
, você pode:isso permite
subset
usar o nome do vetor apenas uma vez. E você pode usá-lo em tubos :)fonte
Primeiro, podemos definir um novo operador,
Então, é como x não remover
ou por que optar por remover, vá diretamente
fonte
ATUALIZAR:
Todas as respostas acima não funcionarão para os valores repetidos, a resposta do @ BenBolker usando
duplicated()
predicado resolve isso:Resposta original: aqui escrevo uma pequena função para isso:
então, digamos
full_vector=c(1,2,3,4,1)
esearched_vector=c(1,2,3)
.exclude_val(full_vector,searched_vector)
retornará (4,1), no entanto, as respostas acima retornarão apenas(4)
.fonte
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
?full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);
- que produz em1, 1, 2
vez da resposta correta1, 2
.removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
Isso define os 13 em um vetor para não um número (NAN). Ele mostra remoção falsa (q [c (11,12,13)]). Se você tentar isso, verá que a função remover não funciona no número do vetor. você remove o vetor inteiro, mas talvez não seja um único elemento.
fonte
Há também o
subset
que pode ser útil às vezes:fonte