2009-07-23 9 views
363

En R, ¿cómo se prueba un vector para ver si contiene un elemento dado?prueba si un vector contiene un elemento dado

+28

veces me pregunto por qué R simplemente no utiliza la palabra contiene para que sea más fácil a los usuarios consideran que – greg121

+8

"en" se contiene en "conta (in) s"; Yo diría que "en" es un contendiente considerablemente conciso en este contexto – hedgedandlevered

+1

Quizás con la adición de los flancos '%' -signos que es. La palabra 'in' es una palabra reservada en uso de R en la construcción for-loop. –

Respuesta

373

Tanto match() (devuelve la primera aparición) como %in% (devuelve un booleano) las funciones están diseñadas para esto.

v <- c('a','b','c','e') 

'b' %in% v 
## returns TRUE 

match('b',v) 
## returns the first location of 'b', in this case: 2 
31

Puede utilizar el %in% operador:

vec <- c(1, 2, 3, 4, 5) 
1 %in% veC# true 
10 %in% veC# false 
54

El cualquier() función hace que para un código legible

> w <- c(1,2,3) 
> any(w==1) 
[1] TRUE 

> v <- c('a','b','c') 
> any(v=='b') 
[1] TRUE 

> any(v=='f') 
[1] FALSE 
+4

Tenga en cuenta que esto se comporta de manera diferente a '% in%': 'any (1 == NA)' devuelve 'NA', donde' 1% en% NA' devuelve 'FALSO '. – dash2

15

también para encontrar la posición del elemento "que" se puede usar como

pop <- c(3,4,5,7,13) 

which(pop==13) 

y para encontrar los elementos que no están contenidas en el vector objetivo, se puede hacer esto:

pop <- c(1,2,4,6,10) 

Tset <- c(2,10,7) # Target set 

pop[which(!(pop%in%Tset))] 
+0

'which' es realmente preferible a veces porque le da * todas * las posiciones correspondientes (como una matriz), a diferencia de' match'. Aunque esto quizás no fue lo que solicitó OP, a diferencia de http://stackoverflow.com/questions/1169388/finding-multiple-elements-in-a-vector – Fizz

+0

¿Por qué molestarse con 'which' si solo quiere encontrar los elementos? no en 'Tset'? Puedes simplemente indexar 'pop' directamente; 'pop [! pop% in% Tset]' – Houshalter

136

is.element() lo convierte en un código más legible, y es idéntico al %in%

v <- c('a','b','c','e') 

is.element('b', v) 
'b' %in% v 
## both return TRUE 

is.element('f', v) 
'f' %in% v 
## both return FALSE 

subv <- c('a', 'f') 
subv %in% v 
## returns a vector TRUE FALSE 
is.element(subv, v) 
## returns a vector TRUE FALSE 
+5

Sé que la documentación dice 'is.element (x, y) es idéntica a x% en% y'. Pero, no sé por qué, 'is.elements' funciona al mezclar números enteros y numéricos y'% en% 'no – pomber

+0

@pomber: ¿Podría dar un ejemplo de esto? – discipulus

8

Realmente como grep() y grepl() para este propósito.

grep() devuelve un vector de enteros, que indican dónde están las coincidencias.

yo <- c("a", "a", "b", "b", "c", "c") 

grep("b", yo) 
[1] 3 4 

grepl() devuelve un vector lógico, con "TRUE" en la ubicación de las coincidencias.

yo <- c("a", "a", "b", "b", "c", "c") 

grepl("b", yo) 
[1] FALSE FALSE TRUE TRUE FALSE FALSE 

Estas funciones distinguen entre mayúsculas y minúsculas.

+8

Por defecto, 'grep' toma una expresión regular como su primer elemento, por lo que para hacer una coincidencia exacta para' "b" ', use'^e $ 'o agregue', fixed = TRUE'). – reinierpost

+8

No utilice la expresión regular para las coincidencias exactas. Esto es peligroso y puede tener resultados inesperados –

+8

Sí, esta es una idea terrible, no buena, muy mala: ineficiente y garantizada para romperse. P.ej. 'myvar <- 'blah'; grepl ('b', myvar, fixed = TRUE) 'devolverá' TRUE' aunque 'b' no esté en 'myvar'. – dash2

15

Voy a agrupar las opciones según la salida. Supongamos el siguiente vector para todos los ejemplos.

v <- c('z', 'a','b','a','e') 

Para la comprobación de presencia:

% en%

> 'a' %in% v 
[1] TRUE 

cualquier()

> any('a'==v) 
[1] TRUE 

es.elemento()

> is.element('a', v) 
[1] TRUE 

Para encontrar la primera ocurrencia:

partido()

> match('a', v) 
[1] 2 

Para encontrar todas las apariciones como vector de índices:

que()

> which('a' == v) 
[1] 2 4 

Para encontrar todas las ocurrencias como lógica vector:

==

> 'a' == v 
[1] FALSE TRUE FALSE TRUE FALSE 

Editar: Extracción grep() y Grepl() de la lista para la razón mencionada en los comentarios

+5

Como ya se comentó [aquí] (https://stackoverflow.com/questions/1169248/r-function-for-testing-if-a-vector-contains-a-given-element/34056066#comment66181358_34056066) y [aquí] (https://stackoverflow.com/questions/1169248/r-function-for-testing-if-a-vector-contains-a-given-element/34056066#comment73025314_34056066), no use 'grep()' o expresiones regulares para encontrar coincidencias exactas. – Uwe

Cuestiones relacionadas