2011-04-28 22 views
20

Estoy tratando de identificar los valores en un marco de datos que no coinciden, pero no puedo encontrar la manera de hacerlo.¿Cómo puedo seleccionar filas de un marco de datos que no coinciden?

# 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) esto funciona, como a es un múltiplo de b. Sin embargo, estoy intentando simplemente seleccionar todos los valores del marco de datos y, que no están en x, y no entiendo qué función usar.

Respuesta

37

Si he entendido bien, lo que necesita la negación del operador %in%. Algo como esto debería funcionar:

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

> subset(b, !(y %in% a$x)) 
    y 
5 5 
6 6 
+0

Gracias @Chase, paso algún tiempo tratando de averiguar cuál era la negación del operador ''% en%, pero podría no resolverlo. Esta respuesta también es útil, ya que cuidadosamente subconjuntos de los datos. – djq

+0

@celenius - el operador '% in%' devuelve un vector lógico que nos dice si hay una coincidencia entre el primer operador y el segundo. '(b $ y% en% a $ x) [1] VERDADERO VERDADERO VERDADERO VERDADERO FALSO FALSO'. El '!' Implica la negación, por lo que devolverá '! (B $ y% en% a $ x) [1] FALSO FALSO FALSO FALSO VERDADERO VERDADERO'. ¿Eso ayuda a explicar las cosas? – Chase

17

Pruebe la función de diferencia de ajuste setdiff. Por lo que tendría

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 
+0

Gracias, esto funcionó perfectamente – djq

Cuestiones relacionadas