Quero remover todas as duplicatas em vários vetores, sem deixar nenhuma. Por exemplo, para estes vetores:
a <- c("dog", "fish", "cow")
b <- c("dog", "horse", "mouse")
c <- c("cat", "sheep", "mouse")
o resultado esperado seria:
a <- c("fish", "cow")
b <- c("horse")
c <- c("cat", "sheep")
Existe uma maneira de fazer isso sem concatenar os vetores e dividi-los novamente?
Talvez você possa fazer:
Se você precisar de variáveis individuais no ambiente global, com a adição de
lst()
fromtibble
:Dados fornecidos em uma lista, por exemplo
lst <- list(a = a, b = b, c = c)
, você pode tentarOutra possibilidade com
collapse::fduplicated(x, all = TRUE)
. Diferentemente do R baseduplicated
, esta função permite que você inclua todos os valores que aparecem mais de uma vez:Benchmark em uma lista de 100 elementos de comprimento 10: minha resposta usando
collapse
é a mais rápida (tempo relativo mostrado). A resposta base R de @Friede é igualmente rápida.código:
Chegando atrasado para a festa de respostas.
Base R, fazendo
!duplicated()
duas vezes.Isso evita
*apply
funções -,Vectorize()
(que sãomapply()
) eouter()
.Dados
Esta solução mantém duplicatas dentro do mesmo vetor e só as remove se houver duplicatas em vários vetores , conforme declarado na pergunta. Por exemplo, aplicando a função a
dá
enquanto outras respostas dão
Usar
setdiff
inouter
.diag
fornece o resultado.Se o conceito de "duplicado" se aplicar, esses vetores são, na verdade, um conjunto de dados. Você deve apenas colocá-los em uma estrutura de dados e criar "dados organizados". Eu sugiro usar o pacote data.table, especialmente se seu conjunto de dados for grande:
Então você pode remover facilmente valores duplicados.
Essa abordagem pressupõe que seu conjunto de dados não seja tão grande a ponto de a demanda de memória para a
variable
coluna ser um problema.