2 votes

Comment trouver les éléments d'un vecteur qui ne sont pas dans un autre (sans utiliser setdiff) ?

J'ai deux vecteurs,

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

y <- c(1,2,3)

Et je veux obtenir un autre vecteur des éléments qui sont dans x et qui ne sont pas dans y, donc dans ce cas (2,4).

J'ai essayé d'utiliser la fonction setdiff() mais elle ne prend pas en compte les doublons (elle ne renverrait que 4), je ne sais donc pas comment procéder.

Merci !

5voto

joran Points 68079

Essayez peut-être ceci :

x[-match(y,x,nomatch = 0)]

El nomatch = 0 est nécessaire pour éviter de mélanger les NA avec les abréviations négatives.

Pour traiter les doublons supplémentaires, comme mentionné dans les commentaires, une autre option pourrait être d'utiliser vsetdiff du paquet vecsets :

library(vecsets)
x = c(1, 2, 2, 3, 3, 4)
y = c(1, 2, 2, 3)
> vsetdiff(x,y)
[1] 3 4

0voto

tmfmnk Points 8978

Il ne donnera pas les résultats tels que discutés par @Gregor, mais il devrait donner les résultats corrects basés sur l'exemple :

x[duplicated(x) | !x %in% y]

[1] 2 4

Par étapes individuelles :

duplicated(x)

[1] FALSE FALSE  TRUE FALSE FALSE

!x %in% y

[1] FALSE FALSE FALSE FALSE  TRUE

duplicated(x) | !x %in% y

[1] FALSE FALSE  TRUE FALSE  TRUE

0voto

cropgen Points 1810

En considérant l'exemple original de l'OP et en lisant le commentaire de @Gregor, j'ai écrit la fonction suivante qui fait ce que l'OP veut et prend également en compte ce que @Gregor a souligné

## function to find values in x that are absent in y
x.not.in.y <- function(x, y) {
  # get freq tables for x and y
  x.tab <- table(x)
  y.tab <- table(y)
  # if a value is missing in y then set its freq to zero
  y.tab[setdiff(names(x.tab), names(y.tab))] = 0
  y.tab <- y.tab[names(y.tab) %in% names(x.tab)]
  # get the difference of x and y freq and keep if > 0
  diff.tab <- x.tab[order(names(x.tab))] - y.tab[order(names(y.tab))]
  diff.tab <- diff.tab[diff.tab > 0]
  # output vector of x values missing in y
  unlist(
    lapply(names(diff.tab), function(val) {
      rep(as.numeric(val), diff.tab[val])
    }), 
    use.names = F)
}

# OP's original data
x.not.in.y(x = c(1,2,2,3,4), y = c(1,2,3))
#> [1] 2 4

# @Gregor's data
x.not.in.y(x = c(1,2,2,3,3,4), y = c(1,2,2,3))
#> [1] 3 4

# some other data with extra value in y but absent in y
x.not.in.y(x = c(1,2,2,2,2,3,3,3,4,5), y = c(1,2,3,6))
#> [1] 2 2 2 3 3 4 5

Créé le 2019-04-15 par le paquet reprex (v0.2.1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X