Czy istnieje funkcja R do znalezienia indeksu elementu w wektorze?

W R mam element x i Wektor v. Chcę znaleźć pierwszy indeks elementu w v, który jest równy x. Wiem, że jednym ze sposobów na to jest: which(x == v)[[1]], ale to wydaje się zbyt nieefektywne. Czy istnieje bardziej bezpośredni sposób, aby to zrobić?

Dla punktów bonusowych, czy istnieje funkcja, która działa, jeśli x jest wektorem? Oznacza to, że powinien zwrócić wektor wskaźników wskazujący położenie każdego elementu x W v.

Author: Joris Meys, 2011-04-07

4 answers

Funkcja match działa na wektorach:

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 zwraca tylko pierwsze spotkanie meczu, zgodnie z Twoim życzeniem. Zwraca pozycję w drugim argumencie wartości w pierwszym argumencie.

Dla wielokrotnego dopasowania, %in% jest droga do zrobienia:

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% zwraca wektor logiczny tak długi jak pierwszy argument, z TRUE, Jeśli wartość ta znajduje się w drugim argumencie, a FALSE w przeciwnym razie.

 319
Author: Joris Meys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-11 10:16:29

Funkcja Position w funprog {base} również wykonuje to zadanie. Pozwala przekazać dowolną funkcję i zwraca pierwszy lub ostatni mecz.

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

 19
Author: pedroteixeira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-11 14:30:27

Mała uwaga o skuteczności wyżej wymienionych metod:

 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

Więc najlepszy jest

    which("Feb" == month.abb)[[1]]
 6
Author: andrii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 18:23:27

R przeciążył operator dwójkowy == metodą znajdowania indeksu igły w stogu wektora. Daje wektor logical, zawierający wartości {[3] } dla każdego dopasowania w stogu siana.

Przykład:

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

To działa, jeśli oba są wektorami, i może być rozszerzony, aby używać wielu wektorów, jak również.

 2
Author: hiten2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-04 16:19:41