Есть ли функция R для нахождения индекса элемента в вектор?
в R, у меня есть элемент x
и вектора v
. Я хочу найти первый индекс элемента v
что равно x
. Я знаю, что один из способов сделать это: which(x == v)[[1]]
, но это кажется неэффективным. Есть ли более прямой способ сделать это?
для бонусных очков, есть функция, которая работает, если x
- это вектор? То есть он должен возвращать вектор индексов, указывающих положение каждого элемента x
на v
.
4 ответов
функции 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%
возвращает логический вектор до тех пор, пока первый аргумент, с TRUE
если это значение можно найти во втором аргументе и FALSE
иначе.
функции Position
в funprog {base} также выполняет эту работу. Он позволяет передать произвольную функцию и возвращает первое или последнее совпадение.
Position(f, x, right = FALSE, nomatch = NA_integer)
небольшая заметка об эффективности вышеуказанных методов:
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
Итак, лучший из них -
which("Feb" == month.abb)[[1]]
R перегружен двойными равными ==
оператор с методом нахождения индекса иглы в векторном стоге сена. Это дает logical
вектор, содержащий TRUE
значения для каждого матча в стоге сена.
пример:
haystack <- c(1, 2, 4, 3, 4)
needle <- 4
indices <- needle == haystack
indices
[1] 3 5
haystack[indices]
[1] 4 4
он работает, если оба являются векторами, и может быть расширен для использования нескольких векторов.