2012-04-24 16 views
5

Tengo las dos listas grandes y pequeñas. Quiero saber cuáles de los elementos de la lista grande no están en una lista más pequeña. La lista consta de propiedadEncontrar elementos que no están en la lista de vectores de caracteres más pequeños, pero en la lista grande

([1] "character"   "vector"    "data.frameRowLabels" 
[4] "SuperClassMethod" 

Aquí está pequeño ejemplo y error estoy consiguiendo

A <- c("A", "B", "C", "D") 
B <- c("A", "B", "C") 
    new <- A[!B] 
Error in !B : invalid argument type 

El resultado esperado es nuevo < - c ("D")

Respuesta

11

Mira help("%in%") - hay un ejemplo en la parte inferior de esa página que aborda esta situación.

A <- c("A", "B", "C", "D") 
B <- c("A", "B", "C") 
(new <- A[which(!A %in% B)]) 

# [1] "D" 

EDIT:

Como señala Tyler, debo seguir mi propio consejo y leer los documentos de apoyo. which() es innecesario al usar %in% para este ejemplo. Por lo tanto,

(new <- A[!A %in% B]) 

# [1] "D" 
+0

la que es innecesaria aquí. –

+0

@Tyler, tienes razón; Debo tomar mi propio consejo: de 'ayuda ("% en% ")': "Ese% en% nunca regresa NA lo hace particularmente útil en condiciones". Incluí 'que' por costumbre, ya que me he quemado sin él. Aquí, es innecesario. – BenBarnes

4

! solo funciona en vectores lógicos. B no es lógico, que es lo que causa el error. Descomponer los pasos que está tratando de hacer le mostrará esto (es decir, !B). En este caso, desea utilizar %in% (o match).

A[!A %in% B] 

para descomponer el código de seguridad:

  1. A %in% B crea un vector lógico que es TRUE para valores de A que existen en B.
  2. !A %in% B niega (invierte) de la lógica en (1)
  3. A[!A %in% B] devuelve el vector de los elementos que se encuentran en TRUE (2)
1

Aunque creo que sets puede ayudar a hacer frente a las diferentes listas.

En su caso, sólo puede utilizar:

A <- c("A", "B", "C", "D") 
B <- c("A", "B", "C") 

# to find difference 
setdiff(A, B) 

# to find intersect 
intersect(A, B) 

# to find union 
union(A, B) 
Cuestiones relacionadas