Is er een R-functie voor het vinden van de index van een element in een vector?

In R, ik heb een element xen een vector v. Ik wil de eerste index van een element in vvinden dat gelijk is aan x. Ik weet dat een manier om dit te doen is: which(x == v)[[1]], maar dat lijkt te inefficiënt. Is er een directere manier om het te doen?

Voor bonuspunten, is er een functie die werkt als xeen vector is? Dat wil zeggen, het moet een vector van indices retourneren die de positie van elk element van xin vvoegen.


Antwoord 1, Autoriteit 100%

De functie matchWerkt op Vectoren:

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

matchretourneert alleen de eerste ontmoeting van een overeenkomst, zoals u heeft aangevraagd. Het retourneert de positie in het tweede argument van de waarden in het eerste argument.

Voor meerdere matching, %in%is de manier om te gaan:

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%retourneert een logische vector zolang het eerste argument, met een TRUEindien die waarde te vinden is in het tweede argument en een FALSEanders.


Antwoord 2, Autoriteit 5%

De functie Positionin Funprog {BASE} doet ook de taak. Hiermee kunt u een willekeurige functie doorgeven en de eerste of laatste match retourneren.

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


Antwoord 3, Autoriteit 3%

een kleine opmerking over de efficiëntie van bovengenoemde methoden:

library(microbenchmark)
  microbenchmark(
    which("Feb" == month.abb)[[1]],
    which(month.abb %in% "Feb"))
  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

Dus de beste is

   which("Feb" == month.abb)[[1]]

Antwoord 4

Ja, we kunnen de index van een element in een vector als volgt vinden:

> a <- c(3, 2, -7, -3, 5, 2)
> b <- (a==-7)  # this will output a TRUE/FALSE vector
> c <- which(a==-7) # this will give you numerical value
> a
[1]  3  2 -7 -3  5  2
> b
[1] FALSE FALSE  TRUE FALSE FALSE FALSE
> c
[1] 3

Dit is een van de meest efficiënte methoden om de index van een element in een vector te vinden.

Other episodes