web-dev-qa-db-fra.com

Comment puis-je sélectionner des lignes d'une trame de données qui ne correspondent pas?

J'essaie d'identifier les valeurs d'une trame de données qui ne correspondent pas, mais je ne sais pas comment faire cela.

# make data frame 
a <- data.frame( x =  c(1,2,3,4)) 
b <- data.frame( y =  c(1,2,3,4,5,6))

# select only values from b that are not in 'a'
# attempt 1: 
results1 <- b$y[ !a$x ]

# attempt 2:  
results2 <- b[b$y != a$x,]

Si a = c(1,2,3) cela fonctionne, car a est un multiple de b. Cependant, j'essaie de sélectionner toutes les valeurs de la trame de données y, qui ne sont pas dans x, et je ne comprends pas quelle fonction utiliser.

29
djq

Si je comprends bien, vous avez besoin de la négation de l'opérateur %in%. Quelque chose comme ça devrait fonctionner:

subset(b, !(y %in% a$x))

> subset(b, !(y %in% a$x))
  y
5 5
6 6
49
Chase

Essayez la fonction de différence définie setdiff. Vous auriez donc

results1 = setdiff(a$x, b$y)   # elements in a$x NOT in b$y
results2 = setdiff(b$y, a$x)   # elements in b$y NOT in a$x
21
Ramnath

Vous pouvez également utiliser dplyr pour cette tâche. Pour trouver ce qui se trouve dans b mais pas a:

library(dplyr)    
anti_join(b, a, by = c("y" = "x"))

#   y
# 1 5
# 2 6
6
Joe