2015-12-09 6 views
2

мне нужно найти соответствие между 2 векторами:Как найти точное соответствие между двумя векторами?

y=c("13AD10","13AD11","13AD12","13AD13","13AD14","13AD16","13AD17","13AD19","13AD1","13AD20","13AD21","13AD24","13AD25","13AD2","13AD3","13AD5","13AD6","13AD7","13AD8","13AD9","13HD10","13HD11","13HD12","13HD14","13HD5","13HD7") 
to_find=c("13AD1","13AD3","13AD7","13AD13","13AD20") 

Основываясь на том, что я нашел на этом сайте, я попытался

select=grep(paste(to_find,collapse="|"),y) 

, который возвращает слишком много записей (все, начиная с 13AD1 есть)

[1] 1 2 3 4 5 6 7 8 9 10 15 18 

Я попытался

select=which(y==to_find) 

, но не все элементы включены

[1] 4 10 18 

В самом деле, я получаю эту

y==to_find 
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE 
[21] FALSE FALSE FALSE FALSE FALSE FALSE 

Несмотря на то, что, например

to_find[1]==y[9] 

[1] TRUE 

Я совершенно запутать, почему я получаю разные результаты для y == to_find и to_find 1 == y [9]? Любая идея о том, как получить точное соответствие между моими векторами? Спасибо за вашу помощь.

PS: вопрос частично ответил там Matching up two vectors in R, но этот пост не содержит объяснения о Grep и ==

ответ

2
which(y %in% to_find) 
# [1] 4 9 10 15 18 
which(to_find %in% y) 
# [1] 1 2 3 4 5 
+1

с этим подходом не сразу понятно, какой индекс соответствует тому, что значение в 'to_find' (если, конечно, OP не заботится). 'match (to_find, y)' ниже - лучший вариант, я думаю –

+0

@stasg Вы правы –

5

как насчет:

to_find %in% y 
# [1] TRUE TRUE TRUE TRUE TRUE 

to_find[to_find %in% y] 
# [1] "13AD1" "13AD3" "13AD7" "13AD13" "13AD20" 

grep(paste(to_find,collapse="|"),y) дает вам «слишком много», потому что ответы например, 13AD1 будет соответствовать 13AD10, потому что первая полностью соответствует последнему.

which(y==to_find) дает вам «слишком мало» ответы, потому что он смотрит на попарного равенства (и вектор to_find возвращают в соответствии с длиной y), так i будет возвращен только если to_find[i] == y[i].

+0

Спасибо за ваш ответ. На самом деле это не работает. Мне нужны позиции «to_find» в «y». Ответ должен быть [1] 4 9 10 15 18 – Matarit

+0

@matarit, что было непонятно из вашего вопроса. то ответ jogo ниже даст вам именно это. однако мое объяснение того, почему ваши подходы не работают, остается –

+0

Спасибо @stas g за ваши объяснения. – Matarit

4

Это даст вам индексы элементов to_find в y:

> match(to_find, y) 
[1] 9 15 18 4 10 

> match(c(to_find, "hallo"), y) 
[1] 9 15 18 4 10 NA 

вы можете сортировать результат:

> sort(match(c(to_find, "hallo"), y)) 
[1] 4 9 10 15 18 
+0

Спасибо, что делает работу очень хорошо. – Matarit

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