Em R, eu tenho um elemento x
e um vetor v
. Eu quero encontrar o primeiro índice de um elemento em v
que é igual a x
. Eu sei que uma maneira de fazer isso é:, which(x == v)[[1]]
mas isso parece excessivamente ineficiente. Existe uma maneira mais direta de fazer isso?
Para pontos de bônus, existe uma função que funciona se x
for um vetor? Ou seja, ele deve retornar um vetor de índices indicando a posição de cada elemento de x
in v
.
r
indexing
match
vectorization
Ryan C. Thompson
fonte
fonte
which(x == v)[[1]]
não é tão ineficiente. É um==
operador de comparação ( ) aplicado a todos os elementos vetoriais e um subconjunto nos índices (which
). É isso aí. Nada que deva ser relevante, desde que você não esteja executando 10.000 repetições nesta função. Outras soluções gostammatch
ePosition
podem não retornar tantos dados quantowhich
, mas não são necessariamente mais eficientes.which(x == v)[[1]]
não é.Respostas:
A função
match
funciona em vetores:match
retorna apenas o primeiro encontro de uma partida, conforme solicitado. Retorna a posição no segundo argumento dos valores no primeiro argumento.Para a correspondência múltipla,
%in%
é o caminho a seguir:%in%
retorna um vetor lógico contanto que o primeiro argumento, com umTRUE
se esse valor puder ser encontrado no segundo argumento e umFALSE
caso contrário.fonte
match
importante se você quiser o índice da primeira ocorrência. Para o seu exemplo,match(x,c(4,8))
fornece resultados diferentes, o que não é super óbvio a princípio.match
. Está tudo explicado lá. Mas eu adicionei essa informação.a função
Position
no funprog {base} também faz o trabalho. Ele permite que você passe uma função arbitrária e retorna a primeira ou a última correspondência.Position(f, x, right = FALSE, nomatch = NA_integer)
fonte
Uma pequena observação sobre a eficiência dos métodos acima mencionados:
Então, o melhor é
fonte
which("Feb" == month.abb)
retorna - por que2
o[[1]]
?which(x == v)[[1]]
, ., Mas que parece excessivamente ineficiente"R sobrecarregou o
==
operador double equals com um método de encontrar o índice de uma agulha em um palheiro vetorial. Ele gera umlogical
vetor, contendoTRUE
valores para cada correspondência no palheiro.Exemplo:
Funciona se ambos forem vetores e pode ser expandido para usar vários vetores também.
fonte
==
operador já foi mencionado na minha pergunta como uma solução ineficiente que não funciona com um vetor de agulhas.FALSE FALSE TRUE FALSE TRUE
vez de índices neste exemplo==
retorna um vetor lógico, não índices. Para isso você precisawhich()
, como expliquei há 7 anos.