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.elements
funciona 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 fruit
faz sentido, fruit in apple
não. is.element(apple, fruit)
ou is.element(fruit, apple)
ambos podem estar certos, dependendo da implementação da is.element
funçã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% NA
retorna 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/…
which
se você só quer encontrar os elementos que não estão Tset
? Você pode apenas indexar pop
diretamente; 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.
grep
assume uma expressão regular como seu primeiro elemento, para fazer uma correspondência exata de "b"
, usar ^e$
ou adicionar , fixed=TRUE
).