2011-04-07 4 views
196

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

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

+0

Поскольку R оптимизирован для работы с векторами, 'which (x == v) [[1]]' не так сильно неэффективен. Это одно сравнение ('==') оператор, применяемый ко всем векторным элементам и одно подмножество по индексам ('which'). Вот и все. Ничто не должно быть релевантным, если вы не выполняете 10.000 повторений этой функции. Другие решения, такие как 'match' и' Position', могут не возвращать столько данных, сколько 'which', но они не обязательно более эффективны. – BurninLeo

+1

В моем вопросе указано, что я бы предпочел функцию, векторизованную над x, а 'which (x == v) [[1]]' is not. –

ответ

279

Функция 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 в противном случае.

+0

Я думаю, что пример с c (2,3,3) и c (1,2,3,4) с совпадением и% in% был бы более поучительным с меньшим количеством изменений между примерами. (c (2,3,3), c (1: 4)) возвращает разные результаты, из которых (c (2,3,3)% в% c (1: 4)), не требуя более длинного первого вектора, и как многие изменения от примера к примеру. Также стоит отметить, что они обрабатывают несоответствия совершенно по-разному. – John

+1

@ Джон: это все правда, но это не то, что спросил ОП. ОП попросил, начиная с длинного вектора, найти первое совпадение элементов, указанных в другом. И для полноты я добавил, что если вас интересуют все индексы, вам нужно будет использовать (% in%). Кстати, нет причин для удаления вашего ответа. Это действительная информация. –

+0

Это действительная информация, но она ушла ...:) – John

19

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

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

3

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

Пример:

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

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

+1

Оператор '==' уже упоминался в моем вопросе как неэффективное решение, которое не работает с вектором игл. –

+0

«он работает, если оба являются векторами» - возможно, в зависимости от того, что вы имеете в виду ... но не в том смысле, в котором нуждается OP. – Frank

+10

Я получаю 'FALSE FALSE TRUE FALSE TRUE' вместо индексов в этом примере –

 Смежные вопросы

  • Нет связанных вопросов^_^