Teste se um vetor contém um determinado elemento


518

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


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

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

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


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

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

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))]

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.


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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.