Teste se um vetor contém um determinado elemento

518

Como verificar se um vetor contém um determinado valor?

medriscoll
fonte
38
às vezes eu me pergunto por R simplesmente não usar a palavra contém para torná-lo mais fácil aos usuários
greg121
12
considere que "in" está contido em "conta (in) s"; Eu diria que "in" é um concorrente consideravelmente conciso nesse contexto
encerrado em 11/03/16
1
Talvez com a adição de %sinais de flanqueamento . A palavra iné uma palavra reservada no uso de R na construção de loop for.
IRTFM
@ greg121 O dplyr já tem uma função contains , mas é usado para uma finalidade diferente: selecionar uma coluna em um quadro de dados. Por exemplo select(iris, contains("etal")).
Paul Rougieux 14/0318
Existe uma maneira concisa de fazer números reais com uma precisão determinada?
Mlt #

Respostas:

500

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
medriscoll
fonte
que tal obter todas as aparências, não apenas a primeira?
StatsSorceress 15/03/19
Talvez eu chegue um pouco atrasado. which(v, 'b'). Observe a ordem dos argumentos.
Niklas Mertsch
Seu which(v, 'b')me dá uma mensagem de erro:> Erro no qual (v, 'b'): argumento para 'qual' não é lógico
Capt.Krusty
176

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
Justin Nafe
fonte
6
Eu sei que a documentação diz 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
pomber
@ pomber: Você poderia dar um exemplo disso?
discipulus
@pomber é fixo?
precisa saber é o seguinte
2
A legibilidade superior 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.
rileymcdowell
70

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

ishandutta2007
fonte
6
Como já comentado aqui e aqui , não use grep()ou expressões regulares para encontrar correspondências exatas.
Uwe
69

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
Dan Goldstein
fonte
9
Esteja ciente de que isso se comporta de maneira diferente de %in%: any(1==NA)retorna NA, onde 1 %in% NAretorna FALSE.
@ user3603486: any(1==NA, na.rm=TRUE)retorna FALSE.
AkselA
36

Você pode usar o %in%operador:

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false
ars
fonte
19

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))]
Armin
fonte
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/…
Fizz
2
Por que se preocupar whichse você só quer encontrar os elementos que não estão Tset? Você pode apenas indexar popdiretamente; pop[!pop%in%Tset]
Houshalter
13

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.

ojdajuiceman
fonte
10
Por padrão, grepassume uma expressão regular como seu primeiro elemento, para fazer uma correspondência exata de "b", usar ^e$ou adicionar , fixed=TRUE).
reinierpost
10
Não use regex para correspondências exatas. Isso é perigoso e pode ter resultados inesperados
David Arenburg
9
Sim, essa é uma péssima, ruim, muito má idéia - ineficiente e com garantia de quebra. Por exemplo myvar <- 'blah'; grepl('b', myvar, fixed=TRUE), retornará TRUEmesmo que 'b' não esteja myvar.