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?

Réponses:


122

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

> setdiff(x, y)
[1] 1

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 .


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


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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.