In R, ik heb een element x
en een vector v
. Ik wil de eerste index van een element in v
vinden 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 x
een vector is? Dat wil zeggen, het moet een vector van indices retourneren die de positie van elk element van x
in v
voegen.
Antwoord 1, Autoriteit 100%
De functie match
Werkt 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
match
retourneert 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 TRUE
indien die waarde te vinden is in het tweede argument en een FALSE
anders.
Antwoord 2, Autoriteit 5%
De functie Position
in 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.