¿Cómo verificar si un vector contiene un valor dado?
%signos de flanqueo que es. La palabra ines 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 ines 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.elementsfunciona 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 fruittiene sentido, fruit in appleno. is.element(apple, fruit)o is.element(fruit, apple)ambos podrían ser correctos dependiendo de la implementación de la is.elementfunció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% NAdevuelve 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))]
whichen 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/…
whichsi solo quiere encontrar los elementos que no están en Tset? Puedes simplemente indexar popdirectamente; 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.
greptoma una expresión regular como su primer elemento, por lo tanto, para hacer una coincidencia exacta "b", use^e$ o agregar , fixed=TRUE).