Como verificar se um vetor contém um determinado valor?
%sinais de flanqueamento . A palavra iné uma palavra reservada no uso de R na construção de loop for.
select(iris, contains("etal")).
Como verificar se um vetor contém um determinado valor?
%sinais de flanqueamento . A palavra iné uma palavra reservada no uso de R na construção de loop for.
select(iris, contains("etal")).
Respostas:
As funções match()(retorna a primeira aparência) e %in%(retorna um booleano) são projetadas para isso.
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'). Observe a ordem dos argumentos.
which(v, 'b')me dá uma mensagem de erro:> Erro no qual (v, 'b'): argumento para 'qual' não é lógico
is.element() cria um código mais legível e é idêntico ao %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. Mas, eu não sei porque, is.elementsfunciona quando a mistura de números inteiros e numéricos e %in%não
is.element()vs %in%é subjetiva. Pode-se argumentar que um operador infix é mais legível porque elimina a ambiguidade na ordem dos argumentos. apple in fruitfaz sentido, fruit in applenão. is.element(apple, fruit)ou is.element(fruit, apple)ambos podem estar certos, dependendo da implementação da is.elementfunção.
Vou agrupar as opções com base na saída. Suponha o seguinte vetor para todos os exemplos.
v <- c('z', 'a','b','a','e')
Para verificar a presença:
%no%
> 'a' %in% v
[1] TRUE
qualquer()
> any('a'==v)
[1] TRUE
is.element ()
> is.element('a', v)
[1] TRUE
Para encontrar a primeira ocorrência:
partida()
> match('a', v)
[1] 2
Para encontrar todas as ocorrências como vetor de índices:
qual()
> which('a' == v)
[1] 2 4
Para encontrar todas as ocorrências como vetor lógico :
==
> 'a' == v
[1] FALSE TRUE FALSE TRUE FALSE
Edit: Removendo grep () e grepl () da lista pelo motivo mencionado nos comentários
A função any () cria código legível
> 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)retorna NA, onde 1 %in% NAretorna FALSE.
any(1==NA, na.rm=TRUE)retorna FALSE.
Também para encontrar a posição do elemento "qual" pode ser usado como
pop <- c(3,4,5,7,13)
which(pop==13)
e para encontrar os elementos que não estão contidos no vetor alvo, pode-se fazer o seguinte:
pop <- c(1,2,4,6,10)
Tset <- c(2,10,7) # Target set
pop[which(!(pop%in%Tset))]
whichàs vezes é preferível, pois fornece todas as posições correspondentes (como uma matriz), ao contrário match. Embora talvez não tenha sido o que o OP solicitou, diferentemente do stackoverflow.com/questions/1169388/…
whichse você só quer encontrar os elementos que não estão Tset? Você pode apenas indexar popdiretamente; pop[!pop%in%Tset]
Eu realmente gosto de grep () e grepl () para esse fim.
grep () retorna um vetor de números inteiros, que indica onde estão as correspondências.
yo <- c("a", "a", "b", "b", "c", "c")
grep("b", yo)
[1] 3 4
grepl () retorna um vetor lógico, com "TRUE" no local das correspondências.
yo <- c("a", "a", "b", "b", "c", "c")
grepl("b", yo)
[1] FALSE FALSE TRUE TRUE FALSE FALSE
Essas funções diferenciam maiúsculas de minúsculas.
grepassume uma expressão regular como seu primeiro elemento, para fazer uma correspondência exata de "b", usar ^e$ou adicionar , fixed=TRUE).