Como saber o que está em um vetor e não em outro?

86

No matlab, existe uma maneira de encontrar os valores em um vetor, mas não no outro.

por exemplo:

x <- c(1,2,3,4)
y <- c(2,3,4)

existe alguma função que me diga que o valor em xque não yestá em é 1?

Tony Stark
fonte

Respostas:

122

você pode usar a função setdiff () (definir diferença):

> setdiff(x, y)
[1] 1
Xela
fonte
37
Cuidado: setdiff(x,y)e setdiff(y,x)não são os mesmos.
Xi'an
59

Sim. Para vetores, você pode simplesmente usar o %in%operador ou is.element()função.

> x[!(x %in% y)]
1

Para uma matriz, existem muitas abordagens diferentes. merge()é provavelmente o mais direto. Eu sugiro olhar para esta questão para esse cenário .

Shane
fonte
28

O arquivo de ajuda em R para setdiff, union, intersect, setequal e is.element fornece informações sobre as funções de conjunto padrão em R.

setdiff(x, y)retorna os elementos de xque não estão em y.

Como observado acima, é uma diferença assimétrica. Então, por exemplo:

> x <- c(1,2,3,4)
> y <- c(2,3,4,5)
> 
> setdiff(x, y)
[1] 1
> setdiff(y, x)
[1] 5
> union(setdiff(x, y), setdiff(y, x))
[1] 1 5
Jeromy Anglim
fonte
12
x[is.na(match(x,y))]
George Dontas
fonte
5

setdiff()é uma função complicada porque a saída depende da ordem da entrada. Em vez disso, você pode escrever uma função simples que faz exatamente o oposto de intersect. Isso é muito melhor.

>difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}

#Now lets test it. 
>x <- c(1,2,3,4)
>y <- c(2,3,4,5)

>difference(x,y)
[1] 1 5
Burro de carga
fonte
2

E se:

x <- c(1,2,3,4)
y <- c(2,3,4)

Qualquer uma dessas expressões:

setdiff(x, y)
x[!(x %in% y)]
x[is.na(match(x,y))]
x[!(is.element(x,y))]

lhe dará a resposta certa [1] 1, se o objetivo for encontrar os valores / caracteres em x, que não está presente em y.

No entanto, aplicar as expressões acima pode ser complicado e pode dar resultados indesejáveis ​​dependendo da natureza do vetor e da posição de xey na expressão. Por exemplo, se:

x <- c(1,1,2,2,3,4)
y <- c(2,3,4)

e o objetivo é apenas encontrar os valores / personagens únicos em x, que não estão presentes em you vice-versa. Aplicar qualquer uma dessas expressões ainda dará a resposta certa[1] 1 :

union(setdiff(x, y), setdiff(y, x))

Graças à contribuição de Jeromy Anglim

OU:

difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}
difference(y,x)

Graças à contribuição da Workhouse

William
fonte