Comment savoir ce qu'il y a dans un vecteur et pas dans un autre?

86

Dans matlab, il existe un moyen de trouver les valeurs dans un vecteur mais pas dans l'autre.

par exemple:

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

y a-t-il une fonction qui me dirait que la valeur xqui n'est pas dans yest 1?

Tony Stark
la source

Réponses:

122

vous pouvez utiliser la fonction setdiff () (set difference):

> setdiff(x, y)
[1] 1
Xela
la source
37
Attention: setdiff(x,y)et setdiff(y,x)ne sont pas les mêmes.
Xi'an
59

Oui. Pour les vecteurs, vous pouvez simplement utiliser l' %in%opérateur ou la is.element()fonction.

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

Pour une matrice, il existe de nombreuses approches différentes. merge()est probablement le plus simple. Je suggère de regarder cette question pour ce scénario .

Shane
la source
28

Le fichier d'aide de R pour setdiff, union, intersect, setequal et is.element fournit des informations sur les fonctions d'ensemble standard de R.

setdiff(x, y)renvoie les éléments de xqui ne sont pas dans y.

Comme indiqué ci-dessus, il s'agit d'une différence asymétrique. Donc par exemple:

> 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
la source
12
x[is.na(match(x,y))]
George Dontas
la source
5

setdiff()est une fonction délicate car la sortie dépend de l'ordre de l'entrée. Vous pouvez à la place écrire une fonction simple en tant que telle qui fait exactement le contraire de intersect. C'est bien mieux.

>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
Bourreau de travail
la source
2

Si:

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

L'une de ces expressions:

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

vous donnera la bonne réponse [1] 1, si le but est de trouver les valeurs / caractères dans x, qui n'est pas présent dans y.

Cependant, l'application des expressions ci-dessus peut être délicate et peut donner des résultats indésirables selon la nature du vecteur et la position de x et y dans l'expression. Par exemple, si:

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

et le but est simplement de trouver les valeurs / caractères uniques dans x, qui ne sont pas présents dans you vice-versa. L'application de l'une de ces expressions donnera toujours la bonne réponse [1] 1:

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

Merci à la contribution de Jeromy Anglim

OU:

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

Merci à la contribution de Workhouse

William
la source