web-dev-qa-db-fra.com

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

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 dans x qui n'est pas dans y est 1?

72
Tony Stark

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

> setdiff(x, y)
[1] 1
103
Xela

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

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

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

53
Shane

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

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

Comme indiqué ci-dessus, il s'agit d'une différence asymétrique. Ainsi, 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
26
Jeromy Anglim
x[is.na(match(x,y))]
12
George Dontas

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
4
Workhorse