Existe uma função R para encontrar o índice de um elemento em um vetor?

em R, tenho um elemento x e um vector v. Quero encontrar o primeiro índice de um elemento em v que seja igual a x. Eu sei que uma maneira de fazer isso é: which(x == v)[[1]], mas isso parece excessivamente ineficiente. Há uma forma mais directa de o fazer?

Para pontos de bónus, existe uma função que funciona se x é um vector? Isto é, deve retornar um vetor de índices indicando a posição de cada elemento de x em v.

Author: Joris Meys, 2011-04-07

4 answers

A função match funciona em vectores:

x <- sample(1:10)
x
# [1]  4  5  9  3  8  1  6 10  7  2
match(c(4,8),x)
# [1] 1 5

match só retorna o primeiro encontro de um jogo, como você pediu. Ele retorna a posição no segundo argumento dos valores no primeiro argumento.

Para correspondência múltipla, %in% é o caminho a seguir:

x <- sample(1:4,10,replace=TRUE)
x
# [1] 3 4 3 3 2 3 1 1 2 2
which(x %in% c(2,4))
# [1]  2  5  9 10

%in% retorna um vetor lógico tanto quanto o primeiro argumento, com um TRUE se esse valor pode ser encontrado no segundo argumento e um FALSE caso contrário.

 319
Author: Joris Meys, 2017-06-11 10:16:29

A função {[[0]} no funprog {base} também faz o trabalho. Ele permite que você passe uma função arbitrária, e retorna o primeiro ou último jogo.

Position(f, x, right = FALSE, nomatch = NA_integer)

 19
Author: pedroteixeira, 2013-02-11 14:30:27

Uma pequena nota sobre a eficiência dos métodos acima referidos:

 library(microbenchmark)

  microbenchmark(
    which("Feb" == month.abb)[[1]],
    which("Feb" %in% month.abb))

  Unit: nanoseconds
   min     lq    mean median     uq  max neval
   891  979.0 1098.00   1031 1135.5 3693   100
   1052 1175.5 1339.74   1235 1390.0 7399  100
Então, o melhor é
    which("Feb" == month.abb)[[1]]
 6
Author: andrii, 2018-05-17 18:23:27

O R sobrecarregou o duplo é igual a == operador com um método de encontrar o índice de uma agulha num palheiro vector. Ele produz um vetor logical, contendo valores TRUE para cada jogo no palheiro.

Exemplo:

haystack <- c(1, 2, 4, 3, 4)
needle <- 4
indices <- needle == haystack
indices
[1] 3  5
haystack[indices]
[1] 4  4

Funciona se ambos são vetores, e pode ser expandido para usar vários vetores também.

 2
Author: hiten2, 2017-03-04 16:19:41