В R у меня есть элемент x
и вектор v
. Я хочу найти первый индекс элемента, v
который равен x
. Я знаю, что один из способов сделать это:, which(x == v)[[1]]
но это кажется чрезмерно неэффективным. Есть ли более прямой способ сделать это?
Для бонусных баллов есть ли функция, которая работает, если x
вектор? То есть он должен возвращать вектор индексов, указывающих положение каждого элемента x
в v
.
r
indexing
match
vectorization
Райан К. Томпсон
источник
источник
which(x == v)[[1]]
это не так уж и неэффективно. Это один==
оператор сравнения ( ), применяемый ко всем элементам вектора, и одно подмножество индексов (which
). Вот и все. Ничего, что должно быть актуально, если вы не выполняете 10.000 повторений для этой функции. Другие решения, такие какmatch
иPosition
могут не возвращать столько данныхwhich
, но они не обязательно более эффективны.which(x == v)[[1]]
это не так.Ответы:
Функция
match
работает на векторах:match
возвращает только первое совпадение матча, как вы просили. Возвращает позицию во втором аргументе значений в первом аргументе.Для множественного соответствия,
%in%
это путь:%in%
возвращает логический вектор до первого аргумента,TRUE
если во втором аргументе можно найти это значение, а вFALSE
противном случае.источник
match
вопросах, если вы хотите индекс первого вхождения. Для вашего примераmatch(x,c(4,8))
дает разные результаты, что на первый взгляд не очень очевидно.match
. Там все объяснено. Но я добавил эту информацию.функция
Position
в funprog {base} также делает свою работу. Это позволяет вам передавать произвольную функцию и возвращает первое или последнее совпадение.Position(f, x, right = FALSE, nomatch = NA_integer)
источник
Небольшое замечание об эффективности вышеперечисленных методов:
Итак, лучший из них
источник
which("Feb" == month.abb)
возвращается -2
почему[[1]]
?which(x == v)[[1]]
, но кажется , что слишком неэффективно.»R перегрузил
==
оператор двойного равенства методом нахождения индекса иглы в векторном стоге сена. Это даетlogical
вектор, содержащийTRUE
значения для каждого совпадения в стоге сена.Пример:
Он работает, если оба являются векторами, и может быть расширен для использования нескольких векторов.
источник
==
Оператор уже упоминалось в моем вопросе , как неэффективное решение , которое не работает с вектором игл.FALSE FALSE TRUE FALSE TRUE
вместо индексов в этом примере==
возвращает логический вектор, а не индексы. Для этого вам нужноwhich()
, как я объяснил 7 лет назад.