Существует ли функция R для нахождения индекса элемента в векторе? - PullRequest
274 голосов
/ 07 апреля 2011

В R у меня есть элемент x и вектор v.Я хочу найти первый индекс элемента в v, равный x.Я знаю, что один из способов сделать это: which(x == v)[[1]], но это кажется чрезмерно неэффективным.Есть ли более прямой способ сделать это?

Для бонусных баллов есть ли функция, которая работает, если x является вектором?То есть он должен возвращать вектор индексов, указывающих положение каждого элемента x в v.

Ответы [ 4 ]

386 голосов
/ 07 апреля 2011

Функция match работает с векторами:

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 возвращает только первое совпадение матча, как вы и просили.Он возвращает позицию во втором аргументе значений в первом аргументе.

Для множественного соответствия, %in% - это путь:

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% возвращает логическоеvector до первого аргумента: TRUE, если это значение можно найти во втором аргументе, и FALSE в противном случае.

23 голосов
/ 11 февраля 2013

функция Position в funprog {base} также выполняет свою работу. Позволяет передать произвольную функцию и возвращает первое или последнее совпадение.

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

7 голосов
/ 17 мая 2018

Небольшое примечание об эффективности вышеперечисленных методов:

 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

Итак, лучший из них -

    which("Feb" == month.abb)[[1]]
0 голосов
/ 18 октября 2016

R перегрузил оператор двойных равных == методом нахождения индекса иглы в векторном стоге сена.Это дает logical вектор, содержащий TRUE значения для каждого совпадения в стоге сена.

Пример:

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

Работает, если оба являются векторами, и может быть расширен для использования нескольких векторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...