¿Cómo verificar si un vector contiene un valor dado?
%
signos de flanqueo que es. La palabra in
es una palabra reservada en el uso de R en la construcción de bucles for.
select(iris, contains("etal"))
.
¿Cómo verificar si un vector contiene un valor dado?
%
signos de flanqueo que es. La palabra in
es una palabra reservada en el uso de R en la construcción de bucles for.
select(iris, contains("etal"))
.
Respuestas:
Tanto las funciones match()
(devuelve la primera aparición) como %in%
(devuelve un booleano) 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
which(v, 'b')
. Cuidado con el orden de los argumentos.
which(v, 'b')
mensaje me da un error:> Error en el cual (v, 'b'): argumento para 'cuál' no es lógico
is.element()
crea un código más legible y es idéntico a %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
is.element(x, y) is identical to x %in% y
. Pero, no sé por qué, is.elements
funciona al mezclar números enteros y numéricos y %in%
no lo hace
is.element()
vs %in%
es subjetiva. Se puede argumentar que un operador infijo es más legible porque elimina la ambigüedad en el orden de los argumentos. apple in fruit
tiene sentido, fruit in apple
no. is.element(apple, fruit)
o is.element(fruit, apple)
ambos podrían ser correctos dependiendo de la implementación de la is.element
función.
Agruparé las opciones según la salida. Suponga el siguiente vector para todos los ejemplos.
v <- c('z', 'a','b','a','e')
Para verificar la presencia:
%en%
> 'a' %in% v
[1] TRUE
ninguna()
> any('a'==v)
[1] TRUE
is.element ()
> is.element('a', v)
[1] TRUE
Para encontrar la primera ocurrencia:
partido()
> match('a', v)
[1] 2
Para encontrar todas las ocurrencias como vector de índices:
cuales()
> which('a' == v)
[1] 2 4
Para encontrar todas las ocurrencias como vector lógico :
==
> 'a' == v
[1] FALSE TRUE FALSE TRUE FALSE
Editar: Eliminar grep () y grepl () de la lista por la razón mencionada en los comentarios
La función any () crea 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
%in%
: any(1==NA)
devuelve NA
, donde 1 %in% NA
devuelve FALSE
.
any(1==NA, na.rm=TRUE)
devoluciones FALSE
.
También para encontrar la posición del elemento "que" se puede utilizar como
pop <- c(3,4,5,7,13)
which(pop==13)
y para encontrar los elementos que no están contenidos en el vector objetivo, uno puede hacer esto:
pop <- c(1,2,4,6,10)
Tset <- c(2,10,7) # Target set
pop[which(!(pop%in%Tset))]
which
en realidad es preferible a veces porque le da todas las posiciones coincidentes (como una matriz), a diferencia match
. Aunque esto quizás no fue lo que solicitó el OP, a diferencia de stackoverflow.com/questions/1169388/…
which
si solo quiere encontrar los elementos que no están en Tset
? Puedes simplemente indexar pop
directamente; pop[!pop%in%Tset]
Realmente me gusta 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 "VERDADERO" 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.
grep
toma una expresión regular como su primer elemento, por lo tanto, para hacer una coincidencia exacta "b"
, use^e$
o agregar , fixed=TRUE
).