2012-03-24 12 views
49

Duplicar posibles:
Standard way to remove multiple elements from a dataframeR No en subconjunto

Sé que en R que si usted está en busca de un subconjunto de otro grupo o juego basado en Identificación del que tendría que utilizar algo como

subset(df1, df1$id %in% idNums1) 

Mi pregunta es cómo hacer lo contrario o elegir elementos que NO coincidan con un vector de identificadores.

He intentado utilizar ! pero el mensaje de error

subset(df1, df1$id !%in% idNums1) 

Creo que mi copia de seguridad es hacerlo en algún momento como éste:

matches <- subset(df1, df1$id %in% idNums1) 
nonMatches <- df1[(-matches[,1]),] 

pero estoy esperando que hay algo un poco más eficiente.

+7

ver mi respuesta aquí: http://stackoverflow.com/questions/7494848/standard-way-to-remove-multiple-elements-from-a -dataframe – Chase

+6

O de manera equivalente a la versión de Chase, mi respuesta [aquí] (http://stackoverflow.com/a/9846035/324364). – joran

Respuesta

102

La expresión df1$id %in% idNums1 produce un vector lógico. Para negar, es necesario para negar toda el vector:

!(df1$id %in% idNums1) 
+2

Recuerde el '()' extra con las declaraciones if. 'if (! (something)) {print" not something "}' –

+0

Los corchetes son un inconveniente cuando hay múltiples anidamientos, he encontrado que la definición de un operador '' not-in'' es bastante útil. Hay varias sugerencias sobre cómo hacer eso aquí: http://stackoverflow.com/questions/5831794/opposite-of-in – PatrickT