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